描述
通过MODBUS4J采集硬件,插件modbus4j 3.3。
概念
-
线圈(0x01,可读可写)和离散输入(0x02,只读取)只能存储状态布尔值,其一个地址就只有一个binary位,就存储一个数据量。
-
保持寄存器(0x03,可读可写)和输入寄存器(0x04,只能读)一个地址有16个bit位,前8位和后8位组成两个byte数据。
二进制数、有/无符号十进制数、十六进制数一个数据量,即对应一个地址数量;
按照IEEE754标准,一个单精度浮点数需要32位bit,即对应两个地址数量,最多能精确7位有效数字;
按照IEEE754标准,一个双精度浮点数需要64位bit,即对应四个地址数量,最多能精确15位有效数字; -
这些bit并非按顺序存储,而是按以下步骤:
1、判断长度是否是8的倍数,不足则高位补0,补成0的倍数
2、8位一组分组
3、按小端模式,高位存储在高地址
例如:浮点数123.4556,对应的二进制为:01000010 11110110 11101001 01111001 (本来就是32位)
modbus
个人认为它是一个主站绑定机器的ip与端口负责对外通讯,可以理解成一个socket程序。
slave
个人理解成挂下主站下的子程序,它只能通过主程序 的IP端口进行访问读写,它可以是多个,每个子程序都有唯一的ID,
offset
子程序的数据类据地址
dataType
子程序的数据类型:线圈(只有一个binary位),保持寄存器(0x03)和输入寄存器(0x04)一个地址有16个bit位,前8位和后8位组成两个byte数据。
二进制数、有/无符号十进制数、十六进制数一个数据量,即对应一个地址
枚举类com.serotonin.modbus4j.code常用常量
/** Constant <code>BINARY=1</code> 线圈(0x01)和离散输入(0x02)*/
public static final int BINARY = 1;
/** 无符号的2字节,只能正数与0</code> */
public static final int TWO_BYTE_INT_UNSIGNED = 2;
/** 有符号的2节节,可表示正负</code> */
public static final int TWO_BYTE_INT_SIGNED = 3;
/** Constant <code>TWO_BYTE_INT_UNSIGNED_SWAPPED=22</code> */
public static final int TWO_BYTE_INT_UNSIGNED_SWAPPED = 22;
/** Constant <code>TWO_BYTE_INT_SIGNED_SWAPPED=23</code> */
public static final int TWO_BYTE_INT_SIGNED_SWAPPED = 23;
/** Constant <code>FOUR_BYTE_INT_UNSIGNED=4</code> */
public static final int FOUR_BYTE_INT_UNSIGNED = 4;
/** Constant <code>FOUR_BYTE_INT_SIGNED=5</code> */
public static final int FOUR_BYTE_INT_SIGNED = 5;
/** Constant <code>FOUR_BYTE_INT_UNSIGNED_SWAPPED=6</code> */
public static final int FOUR_BYTE_INT_UNSIGNED_SWAPPED = 6;
/** Constant <code>FOUR_BYTE_INT_SIGNED_SWAPPED=7</code> */
public static final int FOUR_BYTE_INT_SIGNED_SWAPPED = 7;
/* 0xAABBCCDD is transmitted as 0xDDCCBBAA */
/** Constant <code>FOUR_BYTE_INT_UNSIGNED_SWAPPED_SWAPPED=24</code> */
public static final int FOUR_BYTE_INT_UNSIGNED_SWAPPED_SWAPPED = 24;
/** Constant <code>FOUR_BYTE_INT_SIGNED_SWAPPED_SWAPPED=25</code> */
public static final int FOUR_BYTE_INT_SIGNED_SWAPPED_SWAPPED = 25;
/** Constant <code>FOUR_BYTE_FLOAT=8</code> */
public static final int FOUR_BYTE_FLOAT = 8;
/** Constant <code>FOUR_BYTE_FLOAT_SWAPPED=9</code> */
public static final int FOUR_BYTE_FLOAT_SWAPPED = 9;
/** Constant <code>FOUR_BYTE_FLOAT_SWAPPED_INVERTED=21</code> */
public static final int FOUR_BYTE_FLOAT_SWAPPED_INVERTED = 21;
/** Constant <code>EIGHT_BYTE_INT_UNSIGNED=10</code> */
public static final int EIGHT_BYTE_INT_UNSIGNED = 10;
/** Constant <code>EIGHT_BYTE_INT_SIGNED=11</code> */
public static final int EIGHT_BYTE_INT_SIGNED = 11;
/** Constant <code>EIGHT_BYTE_INT_UNSIGNED_SWAPPED=12</code> */
public static final int EIGHT_BYTE_INT_UNSIGNED_SWAPPED = 12;
/** Constant <code>EIGHT_BYTE_INT_SIGNED_SWAPPED=13</code> */
public static final int EIGHT_BYTE_INT_SIGNED_SWAPPED = 13;
/** Constant <code>EIGHT_BYTE_FLOAT=14</code> */
public static final int EIGHT_BYTE_FLOAT = 14;
/** Constant <code>EIGHT_BYTE_FLOAT_SWAPPED=15</code> */
public static final int EIGHT_BYTE_FLOAT_SWAPPED = 15;
/** Constant <code>TWO_BYTE_BCD=16</code> */
public static final int TWO_BYTE_BCD = 16;
/** Constant <code>FOUR_BYTE_BCD=17</code> */
public static final int FOUR_BYTE_BCD = 17;
/** Constant <code>FOUR_BYTE_BCD_SWAPPED=20</code> */
public static final int FOUR_BYTE_BCD_SWAPPED = 20;
/** Constant <code>CHAR=18</code> */
public static final int CHAR = 18;
/** Constant <code>VARCHAR=19</code> */
public static final int VARCHAR = 19;
//MOD10K two, three and four register types
/** Constant <code>FOUR_BYTE_MOD_10K=26</code> */
public static final int FOUR_BYTE_MOD_10K = 26;
/** Constant <code>SIX_BYTE_MOD_10K=27</code> */
public static final int SIX_BYTE_MOD_10K = 27;
/** Constant <code>EIGHT_BYTE_MOD_10K=28</code> */
public static final int EIGHT_BYTE_MOD_10K = 28;
/** Constant <code>FOUR_BYTE_MOD_10K_SWAPPED=29</code> */
public static final int FOUR_BYTE_MOD_10K_SWAPPED = 29;
/** Constant <code>SIX_BYTE_MOD_10K_SWAPPED=30</code> */
public static final int SIX_BYTE_MOD_10K_SWAPPED = 30;