zoukankan      html  css  js  c++  java
  • Modbus教程

    四种寄存器说明

    线圈状态(coil status 输出端口 对应PLC DO(数字输出)如电磁阀,MOSFET输出

    离散输入状态(input status)输入端口 对应PLC DI(数字输入) ,如拨码开关,接近开关

    保持寄存器(holding Register)输出参数 对应PLC AO (模拟输出)。

    输入寄存器(input  Register)输入参数,对应PLC AI(模拟输入)。

    图1:

     

    寄存器种类

    寄存器PLC地址(address)

    Modbus协议地址

    简称

    读写状态

    线圈状态

    00001~09999

    0000~FFFF (address-1)

    0X

    读写

    离散输入状态

    10001~19999

    0000~FFFF(address-10001)

    1X

    保持寄存器

    40001~49999

    0000~FFFF(address-40001)

    4x

    读写

    输入寄存器

    30001~39999

    0000~FFFF(address-30001)

    3X

     

    注意:程序(代码中)实际使用的是0~FFFF的地址,和PLC地址的关系如上图。PLC地址开头0,1,4,3实际表明了操作的是何种寄存器。

     

    Modbus报文主要由四个部分组成。设备地址,功能码,数据域,校验。

    功能码

    如下图:图2

    功能码

    名称

    寄存器PLC地址

    位、子操作

    操作数量

    01

    读线圈

     见图1,下同

    1或多

    02

    读离散输入

     

    1或多

    03

    读保持寄存器

     

    1或多

    04

    读输入寄存器

     

    1

    05

    写单个线圈

     

    1

    06

    写单个保持寄存器

     

    1

    15

    写多个线圈

     

    16

    写多个保持寄存器

     

    软件说明

    下面以Modbus Poll 和Modbus Slave为例,说明Modbus协议具体内容。

    下载这个两个软件,版本6.X,注册码分别是

    slave
    5455415451475662

    master
    5A5742575C5D10

     对于Slave

    F8设置:

    1.从机地址

    2.设置四种寄存器的一个,配置其开始地址和地址数量。

    F3连接设置,默认就好,Modbus master同理。

     点击Display ->Commnunications查看通信数据。Master相同。

    对于Master

    F8配置

    1.从机地址

    2.图2 中八种功能码中 的一种

    3起始地址(已经给出40011对应10这样的例子)。

    4数据量。

    5扫描频率。

     

    协议格式 

    读协议

    报文格式:

    主===> 从

    从设备地址,功能码,起始地址,寄存器数量,校验。

    从===>主

    从设备地址,功能码,数据域字节数,数据域,校验。

    说明:起始地址和寄存器数量都是big endian (高字节在前,低字节在后),short类型。

    从设备返回的数据域构成:对于位类型,会把每8个位合并成一个byte类型。

    对于字类型,N个寄存器会有N*2个字节,按照高字节在前,低字节在后的顺序。

    例1:01读线圈状态

    slave id为34,寄存器选项为0X,设置起始地址2000,数量20,

    具体数据如图所示

    Master配置成

    读取线圈状态:从设备ID为34,起始地址2000,数量为20的。

    通信数据

    下行:22 01 07 D0 00 14 3B DB

    上行:22 01 03 07 03 03 CA 2D

    例2:02读取离散输入状态

    读取从设备ID 为1,起始地址为0,数量20个离散输入寄存器

    通信数据:

    下行:01 02 00 00 00 14 78 05

    上行:01 02 03 03 03 03 C8 BF

    例3:03读取保持寄存器

    从设备id 50,地址60,数量3

    通信数据:

    下行:32 03 00 3C 00 03 C0 04

    上行:32 03 06 0C 8E 00 38 00 29 49 44

    例4:04读取输入寄存器

    从设备ID 24,起始地址0,数量4

    通信数据:

    下行:18 04 00 00 00 04 F3 C0

    上行:18 04 08 00 0C 00 2D 00 0B 00 2A CE 4A

    写协议

     报文格式:

    单个数据

    主===>从:从设备ID,功能码,起始地址,变更数据,校验。

    从===>主:从设备ID,功能码,起始地址,变更数据,校验。

    多个数据

    主===>从:从设备ID,功能码,起始地址,寄存器数量,字节数量,变更数据,校验

    从===>主:从设备ID,功能码,起始地址,寄存器数量,校验

    起始地址和寄存器数量都是2个字节。

    例5:05写单个线圈

    设置从设备ID 为24,寄存器地址56,在数据编辑框中写1或者0

    通信数据:18 05 00 38 FF 00 0F FE,返回相同。

    如果对线圈写0,通信数据变为18 05 00 38 00 00 4E 0E

    例6:06写单个保持寄存器

    从设备ID,为1,寄存器地址50,写一个数据52

    通信数据:01 06 00 32 00 34 29 D2,返回相同。

    例7:15写多个线圈

    从设备ID为100,寄存器地址50 ,数量20个,写数据如下图

    通信数据:

    下行:64 0F 00 32 00 14 03 03 07 03 E2 29

    上行:64 0F 00 32 00 14 FD FE

     例8:16写多个保持寄存器

    从设备ID为48,寄存器地址100,数量为4

    写入如下数据

    通信数据:

    下行:30 10 00 64 00 04 08 01 01 00 33 00 17 00 09 93 2B

     上行:30 10 00 64 00 04 84 34

     异常响应

    报文格式:从设备ID,功能码,异常码,校验

    返回报文将功能码最高位置为1,

    异常码说明:

    01 非法功能码

    02 非法数据地址

    03非法数据值

    04从设备故障

    参考文档:

    https://wenku.baidu.com/view/d233d09feff9aef8941e0698.html

  • 相关阅读:
    MyCat分库分表-安装
    oracle 字符串格式转化 与 今天 /本周 /本月 查询
    java 接口开发时 后台无法获取前端传过来的参数值
    orace 异常 ORA-01830: 日期格式图片在转换整个输入字符串之前结束
    java json数据返回值中文乱码 出现???
    特殊的日子 2018年总结(一个人的胡言乱语)
    写在2016年的第365天,记录我的2016
    app mui框架 安卓手机app禁止截屏
    oracle 查询函数wm_concat,decode,COALESCE
    后台获取select的值,给页面添加默认值 【js】待续...
  • 原文地址:https://www.cnblogs.com/legion/p/9404229.html
Copyright © 2011-2022 走看看