前两天做了一个小的改造项目,需要使三菱q系列plc和一块led显示屏进行数据通讯,led显示屏经改造后支持rs232和rs485接口的modbus协议,plc侧安装有一块型号为qj71c24n-r2的通讯模块,查此模块资料可知道此模块提供两个rs232物理接口ch1的ch2,可进行基于串口的无协议通讯,唯独不能支持modbus协议。考虑到成本问题,不打算更换硬件,最后经过查询资料和验证后,最终实现modbus协议通讯。以下是大概方法,供各位朋友交流参考,不对之处请指正。
首先要了解下什么是无协议通讯和modbus协议通讯。根据度娘所说:
所谓无协议通讯就是说通信网络的两个或多个终端通过通信网络实现数据的传输,而不必遵循共同的规定或规则。
modbus 协议是应用于电子控制器上的一种语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。
说简单点无协议通讯就相当于画图,想表达什么就画什么,基本上全世界都能看懂。而modbus协议就是中文,只有中国人能看懂。要想让一个不会中文的人和一个只懂中文的人交流,就只能让这个不懂汉字的人模仿汉字的写法,尽管他不认识这个字。所以咱要做的就是教会plc按照modbus协议的格式来和下位机对话,
接下来看下modbus协议的格式内容,以modbus-rtu为例。
站地址:modbus网络中设备都有一个属于自己的站地址,用来区分是哪个设备来接收这个信息。
功能代码:modbus设备所支持的功能代码(需要查询设备手册),比如这次使用的modbus协议卡支持的功能码如下:
01 读线圈、
03 读取保持寄存器、
04 读输入寄存器、
05 写单个线圈、
06 写单个寄存器、
15 写多个线圈、
16 写多个寄存器。
数据地址:modbus设备对应的寄存器地址,查设备手册可知道。
crc校验码:crc16校验码占用1个字节。
plc侧按照手册上接好线,打开模块设置,配置好ch2通道的参数,如图:
然后创建一个子程序,先把ch2 的错误处理程序写上,防止通讯错误,影响其他设备通讯,然后向指定地址写入数据,确定ch2通讯数据长度单位。具体程序如图所示:
上图只是做演示,具体使用地址要看项目中模块的配置数据,具体查询模块手册。
例如我要往画面编号 1 输入内容 abcd在屏幕上显示出来,
先配置设备modbus参数,必须为rtu模式,从站地址24,字节顺序为1234
字节顺序具体看目标设备指定,
/*********************************************************/
18 从站地址 24
10 功能码 16 写多个寄存器地址
00 00 寄存器起始地址 0
00 02 寄存器个数 8 位(画面编号1对应寄存器地址为0,占用8个寄存器共16字节,超过16字节数据会被丢弃)
41 42 ab 的十六进制 acsii 码
43 44 cd 的十六进制 acsii 码
c1 53 crc16 校验码
要从plc发送内容,先确定数据存储区,按照前面所示的数据结构,来定义数据存储区数据。本例子中从d200开始,因为数据全部是按16进制传送,要发送数据必须转换为16进制后再写入存储区,plc发送数据是按照先低八位后高八位的顺序,所以在定义数据发送顺序时必须遵守这个原则,如下面图中程序所示:
这里重点要说一下crc校验指令应用,
这里这个n是8位数据个数,一个d地址是16位,一定要注意,
crc指令在三菱fx-2n以上系列中被支持,但在三菱q系列中,目前只有q03udv以上的cpu支持,往下的cpu只能通过梯形图编写crc校验程序,这种例程在百度上能搜索到很多。
三菱q系列数据发送使用的是g.output指令。
写入控制数据下图为例程:
un的数值要根据模块配置时起始xy地址确定清除错误状态
程序编写完成后,要使用串行模块线路跟踪工具进行发送数据测试,具体路径在工具-智能功能模块用工具-串行通信模块-线路跟踪
查看此区域发送的数据是不是想要发送的数据,数据发送触发完成之后点停止点开始跟踪再选择通道先选择模块
在实际应用中,可能需要对数据进行整理,以下是几个常用数据处理指令
wtob指令:字节转换为字,btow指令:字转换为字节。swap指令:高低位互换。
具体参数编程手册。