================================================= MODBUS 主从模式使用说明书 ================================================= ----------------------------------- 主从模式 ----------------------------------- |device| 具备RS422(RS485)接口和RS232接口的主从模式切换功能。 主模式下,采集仪通过RS422接口或RS232接口连接外部传感器,可以利用脚本中的rs422_send、modbus_send、rs232_send函数对传感器数据进行读取。 从模式下,采集仪通过RS422接口或RS232接口连接PC。使用串口AT命令,可以选择使用RS422或者RS232接口中的一种方式。PC端上位机(比如Modbus Poll)可以通过Modbus RTU协议对采集上的数据(脚本最后一次执行保存的数据)进行读取。从模式下,对应选择接口的主模式函数(rs422_send、modbus_send、rs232_send函数)失效。 .. note:: 目前仅支持 RS422接口 从模式功能。 ----------------------------------- 模式切换和设置 ----------------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 主模式 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 利用串口或者上位机输入AT命令对基站式采集仪进行设置,以串口助手进行设置为例,首先打开串口助手,进行设备连接(正确选择串口号),波特率、数据位、奇偶校验位、停止位。并选择发送新行,打开串口。 在串口助手发送区输入 ``AT+SETSLAVE=none,115200_8N1,1`` 命令进入主模式,然后点击【发送】按钮,在接收区返回OK表示设置成功。其中none代表主模式、115200代表波特率、8代表数据位、N代表奇偶校验位、1代表停止位,最后的1是代表地址。主模式下,波特率和地址无效。 .. figure:: ../_static/modbus_master_set.png :align: center 在串口助手发送区输入AT+GETSLAVE=? 命令可以得到当前设置状态,点击【发送】按钮进行发送。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 从模式 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 利用串口或者上位机输入AT命令对基站式采集仪进行设置。以串口助手进行设置为例,首先打开串口助手,进行设备连接(正确选择串口号),波特率、数据位、奇偶校验位、停止位。在串口助手底部输入 ``AT+SETSLAVE=485,115200_8N1,1`` 命令进入从模式,然后点击【发送】按钮,在接收区返回OK表示设置成功。其中485代表使用RS485的从模式、115200代表波特率、8代表数据位、N代表奇偶校验位、1代表停止位,最后的1是代表Modbus总线地址。 .. figure:: ../_static/modbus_slave_set.png :align: center 此时重启设备,出现嘀的一声后,会连续嘀嘀响,说明设备已经进入从模式。 在串口助手发送区输入AT+GETSLAVE=? 命令可以得到当前设置状态,点击【发送】按钮发送。 --------------------------------- 数据说明 --------------------------------- .. note:: 数据格式依赖于脚本,请先掌握和熟悉脚本编写 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 内部存储格式 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 内部存储格式仅用于说明数据格式 数据内容格式 +---------------+-------------+------------+-----------------+--------------------+ |通道总个数 |通道ID和数据 |通道ID和数据| ... |通道ID和数据 | +===============+=============+============+=================+====================+ | 1 Byte |不定长字节 |不定长字节 | ... |不定长字节 | +---------------+-------------+------------+-----------------+--------------------+ - 通道总个数:数据内容中包含的通道个数 - 同一包数据中,可能有相同的通道ID,依据出现的顺序进行区别 - 数据内容中包含个各要素的采集数据 通道定义格式 +------------------------------------------+------------+--------------------------------------+ |通道ID |通道数据类型| 数据内容 | +=====================+====================+============+======================================+ |主类型ID / MID 1Byte |子类型ID / CID 1Byte| 1 Byte | n Byte | +---------------------+--------------------+------------+--------------------------------------+ - 通道ID:用于区别不同通道,包括主类型和子类型,具体请参见通道编号说明 - 通道数据类型:用以定义通道数据内容的格式,如下 +-----------------------------+--------------------------+--------------------------------------+ |01h |Unsigned char | 1 Byte | +-----------------------------+--------------------------+--------------------------------------+ |02h |Signed char | 1 Byte | +-----------------------------+--------------------------+--------------------------------------+ |03h |Unsigned int | 2 Byte | +-----------------------------+--------------------------+--------------------------------------+ |04h |Signed int | 2 Byte | +-----------------------------+--------------------------+--------------------------------------+ |05h |Unsigned long | 4 Byte | +-----------------------------+--------------------------+--------------------------------------+ |06h |Signed long | 4 Byte | +-----------------------------+--------------------------+--------------------------------------+ |07h |Float | 4 Byte | +-----------------------------+--------------------------+--------------------------------------+ |08h |BCD HH | 1 Byte | +-----------------------------+--------------------------+--------------------------------------+ |09h |BCD MMHH | 2 Byte | +-----------------------------+--------------------------+--------------------------------------+ |10h |BCD YYMMDDHHmmss | 6 Byte | +-----------------------------+--------------------------+--------------------------------------+ |11h |String | n Byte | +-----------------------------+--------------------------+--------------------------------------+ 每当脚本中调用函数 ``add_data_item`` ,《数据内容格式》中通道总个数加1,并按顺序增加一组新的通道ID和数据 以下为一帧数据: +---+---+---+----+----+---+---+----+----+---+---+----+-----------------+---+---+----+-----+---+---+----+-----+ |Num|MID|CID|TYPE|DATA|MID|CID|TYPE|DATA|MID|CID|TYPE|DATA |MID|CID|TYPE|DATA |MID|CID|TYPE|DATA | +===+===+===+====+====+===+===+====+====+===+===+====+==+==+==+==+==+==+===+===+====+==+==+===+===+====+==+==+ |05 |00 |01 | 01 |0C |00 |02 |01 |17 |00 |03 |10 |18|08|22|20|52|00|06 |03 |04 |00|00|06 |02 |04 |00|01| +---+---+---+----+----+---+---+----+----+---+---+----+--+--+--+--+--+--+---+---+----+--+--+---+---+----+--+--+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Modbus 读取保持寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 如果使用Modbus读取保持寄存器命令(03),那么在数据返回前,每条数据将按照4字节对齐展开。不足4字节的将扩展成4个字节,多于4个字节的数据类型将被忽略。 .. note:: 此方法依赖于脚本中 ``add_data_item`` 的调用顺序。对于包含总线型接口的异步操作脚本,不推荐使用此方法。 上面的存储数据将被转换成: +----------+---------------+---------------+---------------+---------------+ | / | item1 | item2 | item3 | item4 | +==========+=======+=======+=======+=======+=======+=======+=======+=======+ |寄存器地址| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +----------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ | 数据 |0C |00 |00 |00 |17 |00 |00 |00 |00 |00 |00 |00 |01 |00 |00 |00 | +----------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 注意:存储格式中的MID:CID/00:03因为数据长度大于4被忽略,数据条目个数由5条变成4条。 然后,按照Modbus寄存器地址进行读取返回。比如,读取寄存器0将返回0C 00。要读取第1个数据条,需要读取寄存器0 连续2个寄存器的数据,然后对返回的4个字节进行数据变换,得到最终的数据值。 注意:返回的数据为低字节优先。 MODBUS示例: - **发送** +----+------+--+---+--+--+--+--+ |地址|操作码|寄存器|个数 |CRC | +====+======+==+===+==+==+==+==+ |01 |03 |00|00 |00|02|C4|0B| +----+------+--+---+--+--+--+--+ - **接收** +----+------+----+-----------+-----+ |地址|操作码|个数|数据 |CRC | +====+======+====+==+==+==+==+==+==+ |01 |03 |04 |0C|00|00|00|F9|63| +----+------+----+--+--+--+--+--+--+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Modbus读取输入寄存器 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 如果使用Modbus读取输入寄存器命令(04),那么将会按照寄存器地址代表的索引值来搜索Mid和Cid,如果匹配并且数据长度小于等于4,将返回该数据条目。数据值将被扩展成4字节。 比如,要读取Mid:Cid = 00:02的数据条目,那么首先要转换成寄存器地址,公式为: (Mid<<8)+Cid = 2。 MODBUS示例: - **发送** +----+------+--+---+--+--+--+--+ |地址|操作码|寄存器|个数 |CRC | +====+======+==+===+==+==+==+==+ |01 |04 |00|02 |00|02|D0|0B| +----+------+--+---+--+--+--+--+ - **接收** +----+------+----+-----------+-----+ |地址|操作码|个数|数据 |CRC | +====+======+====+==+==+==+==+==+==+ |01 |04 |04 |17|00|00|00|FE|30| +----+------+----+--+--+--+--+--+--+ .. |device| replace:: 智能数据采集仪