引言
如果您只有锤子作为工具,那么每个问题都会像钉子一样。
亚伯拉罕·马斯洛(Abraham Maslow)
Modbus协议对于Habr读取器和hicktime读取器都是众所周知的。 许多出版物致力于其应用,由于它们太多了,因此很难列出,并且不时出现新文章。

该协议的普及是由于其开放性和简单性。 应用范围非常广泛:从专业的工业自动化系统到业余的DIY项目(分布式控制系统),“智能”房屋等。 当我的团队从事火车模拟器软件的创建时,我也选择了此协议。 该模拟器使用RS485物理接口上的Modbus RTU协议,通过驾驶员控制台上安装的控件向控制计算机提供数据(不要认为Modbus用于实际的机车车辆!)。
值得一提的是,设置与控制设备的控制器网络交互的软件所涉及的困难。 特别是当部分设备已经存在于熨斗中,而另一部分正在开发和制造过程中时。 在这种情况下,需要编写顶级软件,同时考虑到与这些硬件的交互。 最好以一种立即创建系统工作版本的方式编写它,而不要使用“拐杖”,而这些拐杖通常很难从代码中清除。
您说:“在准备好所有熨斗的原型后,我们需要编写软件。”这是对的,但是……哈哈哈,这在现实世界中很少发生。 在这里,软件仿真器将为我们提供帮助。
1.简要介绍Modbus RTU
我不会详细讨论该协议。 那些对细节感兴趣的人可以使用搜索-协议是开放的,其官方规范和大量信息可从网络上获得。 我只能说在Modbus RTU中它描述了传输数据的二进制格式,并使用RS485标准双绞线电缆作为传输介质。 如果网络具有一个发送器和一个接收器,或者使用RS422进行单向数据传输,也可以使用RS232。
我们将对RS485感兴趣,它是一个半双工接口,一次仅允许一个设备传输数据。 在给定的传输速度下,由于3.5个字符的强制静音间隔的持久性,因此可以在Modbus中进行总线仲裁。 每条消息应以静默间隔开始和结束。 网络中只有一个主设备,而有几个从设备(一个网段中最多有31个从设备,不使用中继器)。 每个从设备都有一个唯一的标识符ID(1到31)。 只有当主机发送请求从该设备接收数据时,才进行从机的数据传输。
典型的向导请求如下所示
编号 | 功能码 | 资料地址 | 数据量(2个字节) | 资料 | CRC16 |
CRC16用于控制传输数据的完整性。 Modus使用Big Endian数据表示法表示法:对于2个字节的值,消息中的最高有效字节在前)。 该协议使用四种类型的数据:
- 线圈-离散输出(1位)读/写
- 离散量输入-只读离散量输入(1位)
- 保持寄存器-可用于读取/写入的输出寄存器(2字节)
- 输入寄存器-可读取的输入寄存器(2字节)
为了响应该请求,从站以以下格式发送数据
从主机收到的消息进入所有设备的接收缓冲区。 但是,如果接收缓冲区的第一个字节与设备ID不匹配,它将忽略接收到的数据,并清除接收缓冲区。 如果该消息是针对该设备的,则它会形成响应,并在保持静默间隔后将其发送给主设备。
正如他们所说,简单但有品位。 您可以在
官方协议规范中了解更多有关这方面的
信息 。 在
此处阅读有关在串行接口上实现协议的方法。 我们没有为此聚集在这里。
在为此类网络开发顶级软件(例如,基于PC实现的主机)时,最好拥有一组允许实现这种概念的软件工具。
该方案的含义如下。 假设我们将来的网络中包含一部分设备。 或到目前为止,还没有这样的设备。 但是,迫切需要编写用于最高管理级别的软件,对其进行调试,以便当网络仍在硬件中实现时,我们不必重写任何内容。 为此,您将必须使用物理传输介质,为此,我们将使用与此类似的设备

其中一个适配器用于连接开发向导的软件。 另一个是用于连接未来奴隶网络的仿真器。 对于带有白色连接器的分支,我们将已经用硬件实现的那部分网络连接起来。 这样,我们就有机会从容地使用标准通信协议,逐步将实际设备投入运行。 此外,将对象提供给客户,我们不会失去在不访问对象的情况下在舒适的实验室环境中修改其软件的机会。 图中的QSlave与软件模拟的网络相同。 自然,您必须编写适当的软件,该软件由作者完成。
2. QSlave-从属网络仿真
QSlave是一个开放的跨平台Modbus RTU网络仿真器。 您可以通过Github上的GPL v2.0许可在上面的链接上获取它。

该应用程序是使用Qt框架以C ++开发的。 一般而言,Qt
具有用于Modbus的库 ,但是任务的具体内容-模拟从站而不是单个从站的网络,导致以下事实:此处未使用Qt的Modbus内置库。 为了处理从虚拟串行端口接收的数据,创建了一个自写的Modbus库。 该库的代码被实现为一个单独的项目,完全独立于用户界面,可用于具有更高级功能的软件仿真意识。 由于Modbus仿真与UI分离,因此使用配置文件配置网络。 选择了XML格式(我们经常在项目中使用它)。
项目代码中提供了示例配置。 一组配置由扩展名为* .net的主文件组成,如下所示
example.net<?xml version="1.0" encoding="UTF-8" ?> <Config> <Slave> <Description>Traffic light</Description> <id>1</id> <config>traffic-light</config> </Slave> </Config>
和每个从属服务器的XML配置文件
traffic-light.xml <?xml version="1.0" encoding="UTF-8" ?> <Config> <Coil> <address>16</address> <description>Red signal</description> <value>0</value> </Coil> <Coil> <address>17</address> <description>Yellow signal</description> <value>0</value> </Coil> <Coil> <address>18</address> <description>Green signal</description> <value>0</value> </Coil> <DiscreteInput> <address>0</address> <description>Ready</description> <value>1</value> </DiscreteInput> <HoldingRegister> <address>5</address> <description>Signal activity time</description> <value>15</value> </HoldingRegister> <InputRegister> <address>2</address> <description>Signals count</description> <value>3</value> </InputRegister> </Config>
最后一个文件包含设备上所有可用数据的描述。 为了下载配置,您需要从QSlave程序菜单中打开* .net文件(文件→打开配置)。 所有配置文件必须位于同一目录中。 示例配置描述了一个从属设备的网络,一个虚拟交通信号灯,其离散输出描述了信号,数字输入指示该设备的某一位已准备就绪(就绪),输入寄存器报告交通信号灯的数量,输出寄存器设置其开启时间。每个信号。

自然,该模拟器不会模拟设备的内部逻辑。 它仅允许您设置主机可用的存储单元的值。 您可以通过编辑表中的相应单元格来随意设置任何值。
尽管非常简单,但该软件可帮助我们在不离开实验室的情况下使用仿真器软件(已调试)。

但是没有人说您不能创建一种更高级的仿真器来模拟虚拟网络设备的运行。 要创建它,可以使用QSlave软件包中提供的modbus库代码。
3. QMaster-主设备的仿真
要创建从站,调试其固件,您需要向导模拟。 有许多开放式仿真器,例如
QModbus 。 我们在工作中一直使用它,直到我们决定将数据传输速率提高到250 kBit / s。 QModbus不允许这样做。 可以从Linux的源代码重建它,但是我们的电子工程师坐在Windows上,并且由于一些原因而没有进行组装。 原来,该应用程序是用Qt 4编写的,使用了第三方libmodbus库。 我想在Qt5上拥有一个跨平台的解决方案,尤其是因为Qt5已经可以与Modbus一起使用。 因此,其模拟是使用Qt Modbus库堆栈
-QMaster编写的 。 在相同条件下,它也可以在Github上使用。

结论
总之,我会说我主要在封闭的项目上工作。 但是,所描述的工具是我在业余时间自行开发的。 另外,在Windows版本中,它们与Qt GPL代码静态链接,因此我必须在收到Qt的相同条件下将它们转移到社区。 另外,这些工具可能对读者有用。
感谢您的关注!