当在Modbus通信中,不需要实时监控从设备状态或控制器本体做从站时,我们可以选择直接请求模式,这种模式按需进行数据交换,从而降低数据通信总线的拥堵,提高通信效率。配置这种模式的通信,需要在串行线路下的添加设备框中,选择添加Modbus_Manager,如图11-27所示。
确认“添加设备”后,我们在设备栏的串行线路下会看到添加的设备名,如图11-28所示。
配置完硬件结构后,开始配置通信参数。首先用鼠标双击串行线路,配置通信参数,这与配置扫描模式是一样的。然后,双击设备名Modbus_Manager,配置通信界面,如图11-29所示。通过这个界面,可以定义这个通信界面是主站还是从站。如果定义为主站,则配置到此结束,所有的从设备可以连接在这个端口上,通信的实现,依靠编辑程序并运行来完成。从设备的地址由程序功能块来定义。当选择了从站,则还需要定义这个端口作为从站的地址。
我们配置好Modbus通信口后,就可以编写程序来请求与从设备进行通信并进行数据交换。这种通信和数据交换,我们要用到3个基本的功能块,它们是:ADDM、READ_VAR、WRITE_VAR,如图11-30所示。
图11-27 添加Modbus串行端口下的Modbus_Manager
图11-28 添加的设备Modbus_Manager
图11-29 设备通信配置界面
图11-30 基本的通信功能块
这些功能块可以用于通过Modbus的通信,也可以用于通过以太网的通信。本章我们阐述通过Modbus的通信,后面章节会阐述通过以太网的通信。在这里先介绍ADDM的作用。ADDM的功能是把显示为字符串的目标地址转化为通信功能块中管脚属性为ADDRESS的地址名称内容。读/写功能块通过这个地址名称就可以识别从设备并与之通信。从某种意义上说就相当于把Addr的输入字符解码并赋值给AddrTable的输入地址名称中。ADDM的输入/输出定义如图11-31所示。
根据这个定义,我们进行功能块应用的输入/输出管脚命名。首先,我们知道AddrTable是一个结构变量,属性为ADDRESS。它只需命名一个变量,而变量的内容是由Addr输入解码来赋值的。Execute是一个开关量,用于启动一次解码。Addr输入是一个字符串,它基于不同的硬件端口而有所不同。SoMachine平台的控制器通信端口定义如图11-32所示。
图11-31 ADDM的输入/输出定义
图11-32 控制器通信端口定义
所以,Modbus串行地址格式的Addr STRING如下:
对于Modbus串行寻址,使用通信端口和目标从站地址(0~247),它们之间用点“.”分隔。
语法格式为:
‘<通信口值>.<从站地址>’
例如,配置的从站在串口1下,从站的地址为“1”。
则Addr的输入字符为‘1.1’。
ASCII地址格式的Addr STRING如下:
对于ASCII寻址,只请求通信端口号。
语法格式为:
‘<通信口值>’
例如,要在串行线路2上发送用户定义的消息,使用字符串。
则Addr的输入字符为‘2’。
通过ADDM功能块定义好通信的从站地址后,就可以通过读/写功能块和这个从站设备进行通信了。
通过在线帮助,我们知道读功能块定义如图11-33所示。
图11-33 读功能块定义
在这里Execute是开关量,每一次开关上升沿启动一次读操作。Abort退出操作。Addr是从设备地址名,来自ADDM的定义。Timeout是读操作限定时间,它的单位是100ms。Ob-jType是一个枚举变量,它用来定义读取对象的类型。例如,我们定义读取对象为Object-Type.MW。FirstObj是要读取从设备参数的Modbus首地址。Quantity是读取对象的数量。Buffer是指定的一个缓冲器的位置,用来存放读取的设备参数值。
同理,我们可知道写功能块的定义如图11-34所示。
在这里Execute是开关量,每一次开关上升沿启动一次写操作。Abort退出操作。Addr是从设备地址名,来自ADDM的定义。Timeout是写操作限定时间,它的单位是100ms。Ob- jType是一个枚举变量,它用来定义写入对象的类型。例如,我们定义写入对象为Object-Type.MW。FirstObj是要写入从设备参数的Modbus首地址。Quantity是写入对象的数量。Buffer是指定的一个缓冲器的位置,用来存放写入的设备参数值。
根据这些读写定义和操作规则,我们就可以编辑一段程序来实现对从设备的读/写操作。首先,我们调入功能块ADDM,定义从设备地址。控制器的通信口为“1”,从站设备地址也是“1”。因此,程序如图11-35所示。(www.daowen.com)
图11-34 写功能块定义
图11-35 地址定义
定义好地址后,我们调入读/写功能块,并定义好输入和输出,如图11-36所示。
编辑完这些程序,就可以运行控制器执行这些程序。首先按下k1,使地址解码赋值,没有错误,则addr_done输出高电平。接着可查出要读出的参数地址,比如要看变频器ATV312的状态,它的参数地址是3201,那么就把3201赋值给d1_readcmd即可。赋值完毕,按下k2,读出的状态就被放在缓冲器里,并且输出给r1、r2。
当要对从设备操作时,我们就可对d1_wrcmd赋命令地址值,命令后面的数据值放在SendBuffer缓冲器里。例如,变频器的使能启动命令地址是8501,转动频率值地址是8502。因此,把8501赋值给d1_wrcmd,然后把命令赋值给wcmd_para,把频率值赋值给wcmd_para2,这样缓冲器里就存好了要写入到从设备的参数。按下k3,完成写入。
图11-36 读/写功能块的编写
利用这个程序,我们做如下案例。
复位LEXIUM32C驱动器错误
采用Modbus控制驱动器输出点开关DQ0,来复位驱动器。
查I/O置位命令地址如图11-37所示。
图11-37 I/O置位命令地址
01:DQ0输出
操作界面如图11-38所示。
图11-38 与程序对应的操作界面
首先读出输出点状态,如图11-39所示。
图11-39 读出操作界面状态
读出值为00,说明没有输出。
使DQ0输出,采用写输出。写入操作界面状态如图11-40所示。
注意:sendpara=0;sendpara2=1。
我们再来读一下DQ0状态,如图11-41所示。
可以看到输出为01。
这时,DQ0输出。
在驱动器中,把DI3设为复位,DQ0的输出接入DI3输入,即可完成通过总线使驱动器复位。设置复位点如图11-42所示。
程序见附件LMC058s_modbus_rw。
图11-40 写入操作界面状态
图11-41 DQ0状态
图11-42 设置复位点
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。