之前章节链接
modbus新起点1--基础篇:http://bbs.gongkong.com/d/201807/764982_1.shtml
modbus新起点连载2--modbus台达篇:http://bbs.gongkong.com/d/201807/765040_1.shtml
modbus的新起点连载3——台达PLC的modbus主站:http://bbs.gongkong.com/d/201807/765110_1.shtml
modbus新起点连载4--台达PLC以太网的数据交换:http://bbs.gongkong.com/D/201807/765957_1.shtml
modbus新起点连载5--台达PLC的modbusTCP客户端程序:http://bbs.gongkong.com/D/201807/765961_1.shtml
modbus新起点连载6——西门子200的modbusRTU: http://bbs.gongkong.com/D/201807/766167_1.shtml
上一章节的分享,主要是基于台达PLC的以太网的资料交换功能。资料交换挺方便的,速度蛮快,但是只支持H03(读取多个寄存器)、H10(写入多个寄存器)、H17(读写多个寄存器),如果需要用到其他功能码的比如01功能(读线圈),02功能(读取输入点)就显得无能为力了。
为此给大家分享一下台达modbus tcp客户端的使用方法。
在这里的我这边依然采用台达12SE的PLC。Modbus TCP指令为ETHRW。
说明如下:
S1的区域占用5个寄存器,S2区域作为协议装置的地址。
在这里用PC的modbus slave工具模拟了一个数值。IP地址为192.168.1.55(PLC的IP地址为192.168.1.99),我对2048之后的一些地址进行赋值如下图:
在这里指令各个参数含义就并不介绍了,直接进入编程环节。程序如下:
可以看出,由于TCP的请求超时默认是3S,基本不用修改,所以第一步忽略,剩下3步。
第一部分 通讯指令填写
S1赋值D0连续5个寄存器,分别存储了IP、模块编号、通讯站号和功能码四个内容。参见程序的第二步。
S2地址:目前modbus slave中赋值的参数从2048(十六进制H0800)开始。
D:读写的数据,如果是读取,存放读取的内容,如果是写入,则存放写入的内容。
第二步 IP、通讯口、读写参数设定
可以看到IP地址占用了一个32位的存储D0,内容为HC0A80127,按八位的拆开后,C0(十进制192),A8(十进制168),01(十进制01),37,(十进制55)。PC的IP正好是192.168.1.55。这样就很明白了。
D2为模块编号,EH3的通讯卡编号和SE的主机固定为K108;当有连接左侧Ethernet模块时,其通讯口分别依其连接台数(最靠近主机的为第1台)编号定义为K100(第1台) ~ K107(第8台)。
D3为站号:站号我习惯默认为1。在modbus TCP中这个参数本身意义不大,只是用来转换RTU和ASCII中才有用。
D4功能码:在这我用读取的指令,使用常用的03的功能码
第三步 判断通讯读取的结果
D1395为存放接收完成时的状态旗标,其bit0~8分别表示哪一个模块的通讯口已经完成接收,也即是bit0~7分别表示左侧第1~8台的通讯口,bit8表示Ethernet 通讯卡;例如EH3(12SE主机) Ethernet通讯卡接收完成,则输入条件判断指令BLD D1395 k8 就会成立。
D1396为存放接收错误的状态旗标,其bit0~8分别表示哪一模块已经发生错误;例如左侧模块第1台EN01的通讯口有接收错误发生,则输入条件判断指令BLD D1396 k0 就会成立。
在这里12SE的主机的通讯均有Bit8决定,所以用其生成了通讯的标志位。
最后看下我们当M0使能后,读取回D50的内容存的是什么。
在把之前的模拟数据拿出来。(因为只读取了5个数,所以D56显示为0)
PS:到这里经历了两周的时间,到台达的章节已经完成,附件是modbus TCP客户端的样例。下一章节的1200部分,由于软件装起来比较费劲。所以可能会稍微慢一点。
在这里分享这么多,只想聚集一群在通信上摸爬滚打的兄弟们,欢迎志同道合的同志们加我微信we9322025.