1、首先需要对PLC进行通讯测试,我用的是XCOM串口助手,查看台达的PLC的使用说明书,看到默认是MODBUS协议的ASCII模式,具体按照说明书测试输入输出就行,期间有遇到以下问题:
1)通讯格式必须设置正确,数据位、波特率、奇偶校验、校验码等,以及从站地址可能默认不是01,可以通过PLC那边设置查看
2)ASCII的时候不要打空格,符号需要时是英文的,CRLF就是一个回车键,最好转换为16进制观察是否和说明书上的十六进制相同
3)测试之前可以先用台达自带的软件测试通讯,确保设备485连线无误。
4)用XCOM串口助手调试的时候出现乱码的现象,后来用唐老鸭试了一下无乱码现象。(废了一天调试,一直以为是硬件问题)
2、串口通讯方面C#中可以用SerialPort类,将通讯格式设置的和说明书中相同。
3、modbus协议部分C#中用的是NMODBUS4,直接在vs中管理NuGet程序包中下载即可
其中包含了RTU\ASCII\TCP模式,我让负责PLC的小伙伴帮忙把PLC的通讯格式改成了RTU,具体是修改M1320,程序不太清楚
里面包括了所以MODBUS的读写方法,和说明书中的一一对应即可,其中对于读取方面,建议是开一个线程一直读取数据。(这里用的是静态方法)
设置master
读取数据
这里需要建立线程,并且线程中需要对进程进行操作,需要用到Invoke()方法,且避免进程时界面还未绘制完成产生报错,需要提前判断该界面IsHandleCreated
void Method1()
{
if (!this.IsHandleCreated)
{
while (true)
{
Thread.Sleep(100);
//Y = InitializeModel.master.ReadCoils(1, 1281, 1);
Auto = InitializeModel.master.ReadCoils(1, 1280, 3);
C = InitializeModel.master.ReadHoldingRegisters(1, 3584, 10);
//C = InitializeModel.master.ReadInput