次氯酸钠投加设备485通讯设置
485通讯广泛应用于次氯酸钠发生器投加设备、次氯酸钠发生器、加药设备上,可提供拓扑站点多,节约模拟量输入输出点,逻辑清晰,简化程序流程的功能。
电磁计量泵类
485通讯基础:
1 通信协议说明
1.1 协议概述
本文制定了我公司电磁泵与PC通信的协议规范,本规范参考标准MODBUSRTU协议格式。
1.2 通信接口
串行通信口采用标准的RS485。
信息传输方式为异步方式,数据位 8 位,停止位 1 位,无校验位(默认)。
数据传输波特率默认使用 9600bps,2400/4800/9600可选。
1.3 通信方式
PC(主机)与电磁泵(从机)采用主从单工通讯方式,最多可有32个从机挂接到485总线上,主机轮询每个从机.若从机无响应或接收到响应的错误信息,则认为本次通信过程失败。
2 协议帧
2.1 协议帧格式
| 对应功能码 | 字节序号 | 0 | 1 | 2-3 | 4-5 | 6-7 |
| 0x03 (读取)0x06(写入) | 字节数 | 1 | 1 | 2 | 2 | 2 |
| 内容 | 从机地址 | 功能码 | 起始地址 | 数据域 | 校验码 | |
| 格式 | ID | FUNC | ADDR | DATA | CRC | |
| 0x06回复数据与发送数据相同 | ||||||
| 对应功能码 | 字节序号 | 0 | 1 | N+1 | N+2~N+3 | |
| 0x03回复 | 字节数 | 1 | 1 | N | 2 | |
| 内容 | 从机地址 | 回复数据长度 | 数据 | 校验码 | ||
| 格式 | ID | LENGTH | CRC | |||
| 对应功能码 | 字节序号 | 0 | 1 | 2 | 3-4 | |
| 0x85(错误吗) | 字节数 | 1 | 1 | 1 | 2 | |
| 内容 | 从机地址 | 0x85 | 错误值 | 校验码 | ||
| 格式 | ID | FUNC | ADDR | CRC | ||
2.2 协议帧说明
2.2.1 ID
从机(模块电源)地址,值范围1-255。0为广播地址,在Modbus总线上从机地址是唯一的。
2.2.2 FUNC
功能码
| 功能码 | 含义 |
| 0x03 | 读保持寄存器,查询电磁泵信息 |
| 0x06 | 写单个寄存器,执行远程指令 |
| 0x85 | 错误 |
错误码
| 错误码 | 含义 |
| 0x01 | 非法功能码 |
| 0x02 | 非法数据地址 |
| 0x03 | 非法数值 |
| 0x04 | CRC错误 |
2.2.3 CRC
主机或从机可用CRC校验码判别接收信息是否正确。由于总线上的电子噪声或一些其它干扰,信息在传输过程中可能会发生错误,接收一方可以使用CRC校验码判断接收到的信息帧是否正确,并放弃错误的信息帧,提高了通信系统的安全性和可靠性。MODBUS通讯协议的CRC(冗余循环码)包含2个字节,即16位二进制数。发送设备计算CRC码,放置于发送信息帧的尾部。CRC算法见附件 “CRC算法”。
3 电磁泵寄存器地址表
3.1 寄存器信息
寄存器地址信息,转换modbus地址(smart200,首先转换成十进制,首位+4功能码,末尾+1)
| 寄存器地址(16进制) | modbus(smart200) | 读/写 | 字节数 | 范围 | 数据类型 | 含义 |
| 0x4000 | 读/写 | 2 | 第一个字节:0-4第二个字节:1-3 | unsigned int | 寄存器第一个字节,校验方式,参数本地配置界面显示0x00:none,8,1(默认)n.8.10×01:odd,8,1o.8.10×02:even,8,1E.8.10×03:mark,8,1A.8.10×04:space,8,1S.8.1 寄存器第二个字节,波特率,参数本地配置界面显示0x03:9600(默认)96..0×02:480048..0×01:240024.. | |
| 0x4001 | 读/写 | 2 | 1-255 | unsigned int | 从机ID,默认0x010x00为广播地址 | |
| 0x4002(16386十进制) | 416387 | 读/写 | 2 | 0-最大频率 | unsigned int | 运行频率,最大频率由厂家设定,超过最大频率,默认最大频率 |
| 0x4003(16387十进制) | 416388 | 读/写 | 2 | 0-1 | unsigned int | 电磁泵启停,0,停止,1,运行 |
4 开发实例
4.0.1 读取/设置波特率
- 读取
产品默认波特率:9600,n,8,1
读取波特率:01 03 40 00 00 01 91 CA
数据解读:01(地址) 03(读取寄存器功能码) 40 00(寄存器地址) 00 01(读取1个寄存器) 91 CA(CRC校验)
回复:01 03 02 00 01 79 84
注:调试过程中如果不确定波特率是多少,在2400,4800,9600下依次测试。
- 设置
设置波特率: 01 06 40 00 00 01 5D CA
数据解读:01(设备地址) 06(设置单个寄存器命令) 40 00(寄存器地址) 00 01(波特率参数:2400) 5D CA (CRC校验)。
回复:01 06 40 00 00 01 5D (06功能码回复成功命令与设置命令相同)。
4.0.2 读取/设置从机地址
- 读取:
00 03 40 01 00 01 C1 DB
读取时00位广播地址
- 读取回复:
01 03 02 00 01 79 84
当前地址为0x01
- 设置:
00 03 40 01 00 01 C1 DB
- 设置回复:
01 03 02 00 01 79 84
4.0.3 读取/设置电磁泵运行频率
- 读取:
01 03 40 02 00 01 30 0A
- 读取回复:
01 03 02 00 78 B8 66
当前运行频率为0x0078(十进制120)
- 设置:
01 06 40 02 00 30 3D DE
设置频率为0x0030(十进制48)
- 设置回复:
01 06 40 02 00 30 3D DE
4.0.4 读取/设置电磁泵停止或启动
- 读取:
01 03 40 03 00 01 61 CA
- 读取回复:
01 03 02 00 01 79 84
当前为启动状态0x0001(0x0000为关闭状态)
- 设置:
01 06 40 03 00 01 AD CA
设置启动0x0001
- 设置回复:
01 06 40 03 00 01 AD CA
4.0.5 错误代码
- 读取不存在的寄存器:
01 03 40 04 00 01 D0 0B
- 读取错误回复:
01 85 01 83 50
功能码0x85,错误码0x01(非法功能码)
5 附件-CRC算法
/* CRC 高位字节值表 */
const UINT8 code auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
} ;
/* CRC低位字节值表*/
const UINT8 code auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
} ;
UINT16 crc16(UINT8 *puchMsg, UINT16 usDataLen)
{
UINT8 uchCRCHi = 0xFF ; /* 高CRC字节初始化 */
UINT8 uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */
UINT32 uIndex ; /* CRC循环中的索引 */
while (usDataLen–) /* 传输消息缓冲区 */
{
uIndex = uchCRCHi ^ *puchMsg++ ; /* 计算CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (uchCRCHi << 8 | uchCRCLo) ;
}
变频器
变频器485通讯说明
附录I:MODBUS协议说明
1、通信配置通过P1.00、P1.05、P9.00和P9.01这四项参数设置。(1)P1.00:如需通信控制变频器频率,请将P1.00的值改成2;(2)P1.05:如需通信控制变频器启停,请将P1.05的值改成0002;(3)P9.00:设置通信的波特率和校验方式,详见第9章节;(4)P9.01:设置变频器站号,请根据实际需求设置;备注1:P9组其他参数(指P9.02P9.07)一般保持默认无须改动备注2:P9.01设为0时属于广播站号。可设置范围为12472、通信功能完成上位机和变频器的通信,包括向变频器发送操作命令,设定运行频率,改写功能码参数以及读取变频器的运行状态、监控参数、故障信息和功能码参数。3、协议格式支持标准MODBUS-RTU格式,CRC校验码支持ModbusCRC-16。(1)如要读取变频器的状态及参数,请使用功能码03(即03读指令)(2)如要改写变频器的参数,请使用功能码06(即06写指令);备注1:数据帧之间的传输间隔要大于3.5字符传输间隔备注2:一次最多可以读取6个地址连续的变频器参数
MODBUS协议(典型常用)
【功能码03】读设定频率 D007H 【对应参数为d0.07往1002H地址写频率后,想确定是否写入成功,可读取D007H里面的数值。不要读取1002H】
【功能码03】读输出频率 D000H【对应的d参数为d0.00】
【功能码06】 启停控制1001H 【 0000H:无效 0001H:正转运行 0002H:反转运行 0003H:停止运行…… 0020H:故障复位】
【功能码06】写设定频率 1002H 【目标频率乘以100后转成十六进制输入,例如:①50.00Hz 5000(十进制)-1388H(十六进制),即往“1002H”地址写入“1388H”,变频器的设定频率变成50.00Hz②23.75Hz-2375(十进制)-0947H(十六进制),即往“1002H”地址写入“0947H”,变频器的设定频率变成23.75Hz其他依次类推备注:往1002H地址写频率后,想确定是否写入成功,可读取D007H里面的数值。不要读取1002H】
余氯仪
流量计