找回密码
 立即注册
Qt开源社区 门户 查看内容

树莓派工控机RevPi(七)-Modbus TCP从站

2019-9-12 15:56| 发布者: admin| 查看: 4330| 评论: 0

摘要: REVOLUTION PI Family是基于树莓派的工业级工控机家族,型号和功能齐全,家族产品还包括现场总线各协议网关比如Profinet/EtherCAT/CANopen等,还包括DIO,AIO等模块。与传统的树莓派相比是真正意义上适用于工业场合的 ...
REVOLUTION PI  Family是基于树莓派的工业级工控机家族,型号和功能齐全,家族产品还包括现场总线各协议网关比如Profinet/EtherCAT/CANopen等,还包括DIO,AIO等模块。

与传统的树莓派相比是真正意义上适用于工业场合的模块,工作温度范围达到-40 ~55 °C,静电保护达到4 kV / 8 kV,且浪涌/爆裂测试以及EMI测试都达到了EN61131-2和IEC 61000-6-2标准的要求。  支持Node-RED,Python,或纯C等多种编程语言;支持通用的工业物联网(IIoT)协议,如MQTT和OPC UA;含两个以太网接口,其中一个可以通过Modbus TCP协议连接工业现场网络,另一个可以连接上级的IT系统或是云端服务器。

Modbus TCP从站应用

本应用示例适用于Jessie Image。但它并不适用于Wheezy。

在以下示例中,我们提供了一个Modbus TCP主站,它采集RevPi Core的CPU温度信息。我们使用的RevPi Core被视为从站。

提醒!在此示例中,我们使用Windows 计算机中的“qModMaster”软件来模拟Modbus主站。可以在https://sourceforge.net/projects/qmodmaster下载此软件。

下面开始正式操作。

  • 通过RJ45连接器将RevPi Core连接到主站网络。

  • 将RevPi Core连接到电源。

首先启用Modbus-TCP 从站功能。

  • 打开网页浏览器。

  • 在浏览器的地址栏中输入RevPi Core的IP地址。

之后将进入登录界面。

  • 使用用户名“admin”登录。

  • 输入密码。你可以在RevPi Core侧面的标签上找到它。

  • 单击“LOGIN”。

现在你可以看到RevPi Core的当前设备状态。

  • 单击“SERVICES”标签。

  • 单击“Enable/Disable ModbusSlave” 行中的“Enabled”。

  • 单击“SAVE ALL”按钮。




  • 单击“APPS”标签。

  • 单击“PiCtory”后面的开始按钮。

进入PiCtory界面。

下面进行Modbus TCP从站配置。

打开设备目录中的“Virtual Devices”文件夹。

选择Modbus TCP Slave。

按住鼠标左键并将Modbus TCP从站拖到RevPi Core旁。Modbus TCP从站现在将出现在配置面板的最右侧。



在“Device Data”窗口中设置该设备的基本设置。此设置是可选的。如果你使用大量设备并希望稍后在另一个程序中处理数据,则此输入可能非常有用。

在“Value Editor”中,我们进行有关TCP连接的设置。在本示例中的设置是:

TCP_port:502。

根据Modbus规范,TCP端口的默认值为“502”。你可以更改这个值。这是可行的,如果你想在同一网络中实现2个不同的控制器,它们不应相互干扰。

max._modbus_TCP_connections:10。



下面保存PiCtory配置。

单击“File>Save”以保存文件。

单击“Tools>Reset Driver”。这将激活设备的更改。

下面说明如何查询CPU温度。

你可以在命令行中使用以下命令查询RevPi Core的CPU温度:

/usr/bin/vcgencmdmeasure_temp

可以得到当前的温度输出:



为了在Modbus上处理这个值,需要转换此输出量。温度需要x10即去掉小数点之后再用作输出量:

/usr/bin/vcgencmdmeasure_temp | awk ' { print substr($0,6,2) substr($0,9,1) } '



现在使用piTest将数据写入Modbus寄存器:

piTest-w Output_1, $(/usr/bin/vcgencmd measure_temp | awk ' { print substr($0,6,2)substr($0,9,1) } ')

为确保温度不仅一次写入寄存器,而是连续写入,整个过程必须循环运行:

whiletrue; do piTest -w Output_1,$(/usr/bin/vcgencmd measure_temp | awk ' { printsubstr($0,6,2) substr($0,9,1) } '); sleep 1; done &



下面进行Modbus-TCP主站配置。

在本示例中使用工具“qModMaster”来查询值。



针对本示例进行以下设置:

  • 通过Modbus TCP连接进行通信:

Modbus模式:TCP

  • 与设备地址为 1的从站通信:

SlaveAddr:1

  • 以1000毫秒的周期提取数据:

扫描速率(毫秒):1000

  • 数据应作为一个完整的Modbus寄存器被读取:

功能码:Read Input Registers (0x04)

  • 数据应以十进制形式输出:

DataFormat:Dec

  • 应从Modbus寄存器地址0开始读取数据:

起始地址:0

  • 要读取完整的寄存器:

寄存器数量:1

单击“选项”,然后选择“Modbus TCP”。

在“从机 IP”栏中设置RevPi Core的IP地址。

设置TCP口。对于Modbus TCP连接,通常为“502”。



单击“连接”。这将从站连接到Modbus主站。



单击“读/写”。这将通过Modbus提取值。



现在可以看到值505。这说明RevPi Core的CPU温度为50.5°C

下面来看看Modbus功能。

Modbus从站模块为你提供以下Modbus功能:

  • 读保持寄存器(0x03)

读输入

  • 读输入寄存器(0x04)

读输出

  • 写单寄存器(0x06)

写入一个输入寄存器

  • 写多个寄存器(0x10)

写入多个输入寄存器

接着再介绍一些简单的操作示例。

首先仍使用主站读输入寄存器功能(0x04)来读取从站的输出。

将寄存器数量改为5。

单击“连接”,将从站连接到Modbus主站。



提取数据时可以选择单次抓取数据:



或者连续抓取数据:



这里使用连续抓取数据的“扫描”功能。

在已建立的SSH连接的命令行中输入“piTest -w Output_1,10”,随后可以在主站中读取到这个数据。



输入“piTest -w Output_2,20”,这个数据随后也出现在主站中。



同样的,由主站向从站写入数据也是可行的。

这时将功能码改为”Write Multiple Registers”(0x10),仍然选择向前5个寄存器写入数据,但将Data Format改为“十六进制”。

之后单击“连接”,将从站连接到Modbus主站。选择“扫描”方式连续处理数据。在五个寄存器中分别输入简单的1,2,3,4,5几个数据。

然后在命令行中输入“piTest -r Input_1”来读取从站输入口1的数据。



在主站中将1号寄存器的值改为“10”,读取的从站输入口1的数据也随之变化。



下面介绍如何一次性读取5个从站输入端口的数据。

首先需要明确从站输入口1 的Offset值。在命令行输入“piTest-v Input_1”可以获取详细信息。



从显示的信息可以看到Input_1的Offset值为11。

这样就可以使用“piTest -r 11,10,h”命令来读取从offset11开始的10个字节,并且以十六进制的格式显示。



一个Modbus TCP从站有32个输入寄存器和32个输出寄存器可供使用。如果你需要更多,也可以在PiCtory里配置多个Modbus TCP从站。

----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:工业通讯,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了