参考1:(147条消息) 欧姆龙PLC的FinsTCP协议_weixin_37700863的博客-CSDN博客_欧姆龙fins协议tcp
参考2:(147条消息) FinsTCP协议报文详细分析_常哥说编程的博客-CSDN博客_fins协议
参考3:(147条消息) 欧姆龙FINS通讯命令实例详解_搬砖dog的博客-CSDN博客_欧姆龙fins
上述文档中有部分描述错误、不清,互相印证来看。
1、欧姆龙PLC的默认端口号为9600,将上位机PC与PLC设置为同一网段,验证是否能ping通
2、不同一般的socket通讯,与欧姆龙plc进行正式读写前,首先要进行一次握手确认。这里不同于tcp/ip里的connect三次握手,而是在对PLC进行读写之前,首先PC发送固定命令给PLC进行握手确认。这是第一步,否则无法建立有效通讯!如果握手失败,通讯即断开。
3、Fins帧格式中,目标节点(DA1)、源节点(SA1),是对应设备IP地址最后一段的16进制数。假设PC的IP地址:192.168.2.20,PLC的地址:192.168.2.15,当PC发送命令给PLC时,DA1 = 15 = 0x0F,SA1 = 20 = 0x14。当PLC反馈给PC命令时,DA1 = 20 = 0x14,SA1 = 15 = 0x0F。
4、读取/写入存储区的地址格式是3个字节address,起始地址(2byte)+位地址(1bypte)。位地址为00,起始地址为操作存储区地址的16进制数。如果DM2000,则起始地址为:07D0,位地址为00。结合起来为07D000
5、所有命令为16进制发送,实现过程是:16进制字符串->每2位字符串转成对应的16进制数->转成10进制->赋值给对应位置的字符数组元素。例如FINS帧头:“46494E53”,"46" -> 0x46 -> 70 ->chSend[0] = 70;以此类推