快速入门 | 篇二十:正运动技术运动控制器MODBUS通讯
点击上方“正运动小助手”,随时关注新动态!
正运动技术运动控制器MODBUS通讯
材
料
准
备
另:IO设备、扩展模板等根据需求选用。
自带16个脉冲轴,面板上包含15个脉冲接口和3个编码器接口,第16个脉冲轴由OUT输出口控制。
01
三类串口说明
RS232串口常用于连接PC或人机界面
RS485串口常用于与控制装置和智能仪表的通讯控制
RS422串口只有个别型号控制器才有此接口
RS232
控制器的RS232接口采用DB9公头,使用相应的连接线连接两个设备。
|
针脚号 |
名称 |
说明 |
|
2 |
RXD |
接收数据引脚 |
|
3 |
TXD |
发送数据引脚 |
|
5 |
EGND |
电源地 |
|
9 |
E5V |
电源5V输出,可用于对文本屏供电 |
RS485
RS485接口采用差分传输方式,通过判断A与B之间的电压差来确定是高电平或低电平。
|
针脚名称 |
|
|
|
|
|
|
|
|
|
|
控制器的RS485接口采用了简易接线方式,如下图所示,控制器的485A、485B、EGND地线, 分别接第一个从站的A、B、地线, 然后再接第二个从站的A、B、地线(A 接 A, B 接 B,信号共地),并且控制器和最后一个从站的485A 和485B 要并联120 欧电阻防止信号反射,线缆需要使用屏蔽双绞线,避免信号干扰,每个节点支线的距离要小于3m。
RS422
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
02
串口参数
连接串口使用:串口通常可选RS232串口或RS485串口,不管哪种串口,除了端口号和接线方法有所不同,默认参数与操作指令都是相同的。
串口默认参数为:波特率38400,数据位8,停止位1,校验位无,采用SETCOM指令配置串口参数。控制器重新上电后,SETCOM参数会还原成默认值,所以请在程序开头写SETCOM设置。
控制器所有串口的MODBUS协议站号ADDRESS为1-127,缺省=1。
在一个MODBUS网络上的所有设备都必须选择相同的传输模式和串口参数,否则无法通讯。
控制器默认PORT0(COM0)为RS232串口,PORT1(COM1)为RS485串口,PORT2(COM2)为RS422串口,支持在线命令窗口发送?*setcom打印查看,或在“控制器状态”窗口查看。
SETCOM指令除了可以配置串口的通讯基本参数外,还可以选择参数配置通讯协议,设置控制器为主端设备还是从端设备,默认为从端,还可以开启自定义通讯模式(即mode=0无协议模式)。
语法:SETCOM (baudrate,databits,stopbits,parity,port[,mode] [,variable] [,timeout])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mode参数选择协议:
1.与触摸屏通讯时,mode参数选择协议:4
Port0:setcom(9600,8,1,0,0,4,2,1000)
Port1:setcom(9600,8,1,0,1,4,2,1000)
2.控制器通过RS485做主站时,mode参数选择协议:14
Port1:setcom(38400,8,1,0,1,14,2,1000)
03
网口参数
控制器网口支持MODBUS-TCP协议,出厂默认IP地址为192.168.0.11,可使用IP_ADDRESS指令修改IP地址或在修改IP地址窗口修改,修改一次永久生效。
控制器至少包含2个网口通道,可在在线命令发送?*port打印查看,如下图,网口的端口号为502。
不同的控制器可通过网口互联,EtherNET网线接口只有一个,可使用交换机,网口互联的前提是两个控制器均有CONNECT通道,用MODBUSM_DES2指令开启连接。
04
串口/网口读写
MODBUS通讯通过功能码告诉被寻址到的终端执行何种功能,如运行命令、读取监控状态、修改参数、读取参数等,MODBUS协议制定了相关的功能码。
控制器也可直接使用MODBUS通讯功能码,为方便使用,将一些常用的功能码直接封装为Basic指令,如下表Basic指令对应功能码。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1.MODBUS寄存器
MODBUS通讯的数据使用MODBUS寄存器存储,控制器的MODBUS寄存器符合MODBUS标准通讯协议,分为位寄存器和字寄存器两类。
位寄存器:MODBUS_BIT(布尔型)。
字寄存器:包含MODBUS_REG(16位整型)、MODBUS_LONG(32位整型)、MODBUS_IEEE(32位浮点型)、MODBUS_STRING(8位字节型)。
控制器中MODBUS字寄存器占用同一片系统变量空间,其中一个LONG占用两个REG地址,一个IEEE也占用两个REG地址,使用时要注意错开字寄存器编号地址。
所以要注意MODBUS_REG、MODBUS_LONG、MODBUS_IEEE地址在用户应用程序中不能重叠。
控制器的MODBUS存储空间安排如下:
2.MODBUS读写相关指令
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3.MODBUS读/写语法格式相同,如下所示:
MODBUSM_REGGET (startreg, num, local_reg)
startreg:对端的寄存器起始编号,从0开始
num:寄存器个数
local_reg:从本地系统MODBUS寄存器中取值,起始编号
MODBUSM_REGSET (startreg, num, local_reg)
startreg:对端的寄存器起始编号,从0开始
num:寄存器个数
local_reg:从本地系统MODBUS寄存器中取值,起始编号
使用示例:
MODBUSM_REGGET(0,10,100) '把对端位寄存器0~9复制到通讯本地的寄存器100~109MODBUSM_REGSET(0,10,100) '把本地位寄存器100~109设置到通讯对端的寄存器0~9
4.建立MODBUS通讯
(1)串口
MODBUSM_DES (address[,port],[timer],[resendset])ADDRESS1 = MODBUSM_DES([port])address:对端的modbus协议站号port:当前modbus主通讯的port号timer:消息超时时间设置,缺省1000ms。resendset:超时消息重发设置,0-不重发,1-SEND指令重发,2-SEND与MODBUSM指令都重发。
(2)网口
MODBUSM_DES2 (id,port,"desipaddress",[timer],[resendset])id:对方控制器的MODBUS从端ID,缺省1port:支持两种模式,?*PORT确认通道号及模式ETH时,作为MODBUS_TCP主端通道CONNECT时,做为控制器互联通道desipaddress:字符串, 对方控制器的IP地址timer:消息超时时间设置,缺省1000msresendset:超时消息重发设置,0-不重发,1-SEND指令超时重发,2-SEND与MODBUSM指令都超时重发。
05
串口通讯例程
控制器RS485做主站与从站的通讯。
工程项目下包含三个文件:
ModbusRead.bas :建立通讯连接,主站读取从站数据。在线命令RUN开启任务,开启前先停止写入任务,开启语法:RUN “ModbusRead”, 1。
ModbusSet.bas :建立通讯连接,主站数据复制到从站。在线命令RUN开启任务,开启前先停止读取任务,开启语法:RUN “ModbusSet”, 2。
ModbusIni.bas :参数初始化,设置RS485的主从端,从站节点个数等信息。设为上电自动运行任务。
例程设置了一个从站,支持设置多个从站,从站数量修改slaveCount参数。
为了方便观察数据,主站和从站均使用的控制器,将两个控制器通过RS485连接。
注意主站控制器的RS485需要处于ModbusMaster模式,如下图。从站控制器的RS485需要处于ModbusSlave模式。
ModbusIni.bas文件程序
'************************变量定义*********************Global slaveCountslaveCount = 1 '从站的数量'因为从站地址ADDRESS不能为0, 0为广播地址,所以后面的slaveID是从1开始, 所以数组大小+1Global slaveID(slaveCount+1)For i = 1 to slaveCount '索引从1开始slaveID(i)=i '从站ID从1开始, 一般由拨码或者从站设置软件设置NextGlobal keepReading, modbusErrorStatus, writeSlaveIDwriteSlaveID = 1 '用户可通过PC程序选择要写入哪个从站数据keepReading = 1 '持续读取的判断标志变量, 用户不需要修改,用做while循环条件modbusErrorStatus = 0 '判断是否通信正常的标志变量'************************串口参数设置*********************'SETCOM (baudrate,databits,stopbits,parity,port [,mode] [,variable] [,timeout])'参数依此为:波特率,数据位,停止位,校验位,串口端口号(默认232端口号0,485端口号为1)'后三个缺省参数:MODBUS模式(14代表控制器做主站,默认4为从站),MODBUS寄存器设置(2为缺省, MODBUS寄存器独立, 不和VR或TABLE映射),通信超时阈值SETCOM(38400,8,1,0,1,14,2,1000)
ModbusRead.bas文件程序
'互斥操作,防止读写同时操作,多个modbus指令同时运行, 会造成通信出错'STOP "modbusSet.bas"'用做modbus通信的成功标志变量modbusErrorStatus = 0 '通讯正常值为0,通讯异常值为1while keepReadingFor i = 1 to slaveCountMODBUSM_DES(slaveID(i),1) '和从站1通讯'MODBUSM_REGGET (0, 8, 10),从站1寄存器0-7的数据复制到主站10-17MODBUSM_REGGET(0,8,slaveID(i)*10) '获取对端寄存器值WAIT UNTIL MODBUSM_STATE <> 1 '等待消息结束IF MODBUSM_STATE=0 THEN?slaveID(i),"号节点通讯正常"Else?slaveID(i),"号节点通讯出错!!!"modbusErrorStatus = 1'可以在此处加入用户的错误处理程序EndifDelay(100) '两个节点之间的通信延时NextWend
ModbusSet.bas文件程序
'互斥操作,防止读写同时操作keepReading = 0STOP "ModbusRead.bas"modbusErrorStatus = 0'如果取消对从站ID的判断(If), 则需要提前写好所有从站对应的主站寄存器数据FOR i = 1 To slaveCountIF slaveID(i) = writeSlaveID THEN '遍历从站节点,writeSlaveID参数选择将主站数据写到哪个从站节点MODBUSM_DES(slaveID(i),controllerPort) '建立主从站连接'MODBUSM_REGSET(10, 2, 110),主站寄存器110-111的数据传递给从站1的10-11MODBUSM_REGSET(10,2,100 + slaveID(i)*10)WAIT UNTIL MODBUSM_STATE <> 1 '等待消息结束IF MODBUSM_STATE=0 THEN?slaveID(i),"号节点通讯正常"ELSEmodbusErrorStatus = 1?slaveID(i),"号节点通讯出错!!!"'可以在此处加入用户的错误处理程序ENDIFDELAY(100) '两个节点之间的通信延时ENDIFNEXT'*****重新恢复循环读取任务,是否需要取决于应用*****DELAY(3000)'RUN "ModbusRead.bas"
运行效果
1.MODBUSM_REGGET读取:读取从站MODBUSM_REG寄存器0-7共8个数据到主站的 MODBUSM_REG寄存器10-17。
从站数据:
主站初始数据均为0,读取完成主站数据:读取了从站的8个数据。
2.MODBUSM_REGSET写入:将主站MODBUSM_REG寄存器110-111共2个数据写入从站的 MODBUSM_REG寄存器10-11。
主站数据:
读取完成从站的数据如下:读取了主站的2个数据。
06
网口通讯例程
采用两个控制器通过交换机网口互联。
主端控制器IP:192.168.0.11
从端控制器IP:192.168.0.36
分别使用ZDevelop软件连接这两个控制器,接线参考如下,采用ETH网口通道5,下载程序后查看运行效果。
主端程序
MODBUS_REG(0)=0MODBUSM_des2($1 , 5, "192.168.0.36") '主端与从端建立连接,控制器IP不能相同WHILE 1FOR i =0 TO 10MODBUS_REG(0) = iMODBUSM_REGSET(0,1,0) '主端数据写入从端MODBUS_REG(0) = 99MODBUSM_REGGET(0,1,0) '主端从从端读取数据IF MODBUS_REG(0) <> i THEN '判断MODBUSM_REGGET(0,1,0)是否读取成功PRINT "modbus_reg(0)=" MODBUS_REG(0), "modbusm_state=" MODBUSM_STATEENDIFNEXTWENDEND
从端程序
ADDRESS=1 '从端站号=0WHILE 1IF MODBUS_REG(0) <> 0 THENPRINT MODBUS_REG(0)ENDIFWENDEND
运行效果:
主端先将数据传给从端,修改主站数据后,再从从端获取数据,获取数据成功,IF条件不满足,打印不执行。
从端接受来自主端的数据,改变了MODBUS_REG(0)的值,并循环打印。
07
网口互联例程
采用两个控制器通过交换机网口互联。
主端控制器IP:192.168.0.11
从端控制器IP:192.168.0.36
分别使用ZDevelop软件连接这两个控制器,采用CONNECT互联通道20,必须两个控制器都包含CONNECT通道才可以正常通讯,下载程序后查看运行效果。
主端程序
MODBUS_REG(0)=0MODBUSM_des2($1 , 20, "192.168.0.36") '主端与从端建立连接,控制器IP不能相同WHILE 1FOR i =0 TO 10MODBUS_REG(0) = iMODBUSM_REGSET(0,1,0) '主端数据写入从端MODBUS_REG(0) = 99MODBUSM_REGGET(0,1,0) '主端从从端读取数据IF MODBUS_REG(0) <> i THEN '判断MODBUSM_REGGET(0,1,0)是否读取成功PRINT "modbus_reg(0)=" MODBUS_REG(0), "modbusm_state=" MODBUSM_STATEENDIFNEXTWENDEND
从端程序
ADDRESS=1 '从端站号=0WHILE 1IF MODBUS_REG(0) <> 0 THENPRINT MODBUS_REG(0)ENDIFWENDEND
运行效果:
与网口通讯例程相同,主端先将数据传给从端,修改主站数据后,再从从端获取数据,获取数据成功,IF条件不满足,打印不执行。
从端接受来自主端的数据,改变了MODBUS_REG(0)的值,并循环打印。
正运动技术运动控制器MODBUS通讯就讲到这里,更多学习视频及图文详解请关注我们的公众号“正运动小助手”。
本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。
回顾往期内容
关于正运动技术
正运动技术是一家专注于运动控制技术研发与应用的国家级高新技术企业,主要从事运动控制器、运动控制卡、视觉运动控制一体机以及IO扩展模块等产品的研发、生产、销售和服务。
公司汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校致力于运动控制技术研究与应用,是国内工控领域发展最快的企业之一,也是国内完整掌握运动控制核心技术和实时工控软件平台技术的企业。
