功能要求
- 采集来自PLC的生产数据和报警信息
- 采集来自测试仪的测试数据
- 可以分机种保存一些参数
- 将采集的数据写入Excel,供MES系统查询和现场查看
项目实现
1、采集PLC数据
硬件采用RS232串口,通讯协议使用ModusbusRTU。以前跟PLC通讯,为求简单,一般直接使用无协议,使用倒没问题,但偶尔出现数据丢失也是烦人,要确保对方接收到数据还要双方写返回数据。使用modbus协议,PLC基本不用写通讯程序,而上位机可以直接自己确认对方是否收到数据,再确认是否给对方重发一次。这个项目只要求采集数据,因为读取的频率高于数据变化,所以偶尔读不到都不影响,使用modbus就更合适了。
/// <summary>
/// 通过Modbus读取PLC,获取相应数据
/// </summary>
private void ScanPLC()
{
//创建字节数组
byte[] result = null;
//从站号
ushort DevAdd = 1;
//起始地址
ushort Address = 100;
//长度
ushort Length = 5;
while (running)
{
if (plcConnected)
{
result = objModbus.ReadKeepReg(DevAdd, Address, Length);
DataProcessing(result, Length);
}
else
{
try
{
objModbus.OpenMyCom(9600, comName1, 8, Parity.Odd, StopBits.One);
//objModbus.ReadTimeOut = 500;
plcConnected = true;
textReceive.Invoke(new ExecuteWork(RecRunData), "重连PLC成功");
}
catch (Exception ex)
{
textReceive.Invoke(new ExecuteWork(RecRunData), "重连PLC失败:" + ex.Message);
plcConnected = false;
}
}
Thread.Sleep(1000);
}
}
2、采集测试仪数据
硬件也是采用RS232串口,因为测试仪的说明书不完善,modbus协议没有测试成功,而无协议测试成功了,所以直接采用无协议接收数据。采取的采集数据模式是,测试仪有测试数据马上主动通过串口发送,而我的程序只要一直处于接收状态,有数据就记下。所以建了一个线程一直扫描串口数据。
关于串口无协议通讯,以前也有个烦恼。就是接收数据有时会把一条数据拆成两条或者两条数据合成一条接收,要进行一些处理判断很是麻烦。这次发现Serial自带的读取功能很全面(可以在Serialport这个类下找到)。于是我直接采用了下面这个函数,再也不用担心老是读错数据了~
//
// 摘要:
// 一直读取到输入缓冲区中的指定 value 的字符串。
//
// 参数:
// value:
// 指示读取操作停止位置的值。
//
// 返回结果:
//