广播模式:全部从机都会收到上位机信息
Broadcasting This mode of communication enables the master to transmit a message to all slaves
simultaneously. The master does not receive a reply, however, and is thus unable to check
whether the message has been correctly received by every slave.python
只有单一从机收到:
Data interchange This mode of communication enables the master to communicate with a single slave. This
normally involves the transmission of two messages: the master transmits a request and
the slave responds to this request. Only the master is permitted to request a response. The
request is received by every slave, but only the selected slave responds. The response
must be received within a stipulated time, otherwise the master will assess the attempt as
failed and must transmit the request again.app
以下数据格式:
The data are transmitted serially via the bus. The following format applies:
1 start bit
8 data bits (the least significant bit first)
1 stop bit
The parity bit can be set for devices of Class.Group = 5.20
9600 baud or 115’200 Baud (only with devices of Class.GrouThis results in 10 bits (11 bits with active parity bit) per transmission byte.less
Note on the presentation of messages: Each box presents 1 data byte consisting of 8 bits, unless otherwise stated.
Each message sent by the master possesses the following format:ui
设备地址 | 方法代码 | 方法参数 | CRC校验 高位 | CRC校验 低位 |
---|---|---|---|---|
DevAddr | 0 Function code | n byte parameters (optional) | CRC16_H | CRC16_L |
FA | 49 | 01 | A1 | A7 |
· DevAddr: Address of the device.
Address 0 is reserved for broadcasting.
Addresses 1...249 can be used for bus mode.
Address 250 is transparent and reserved for non-bus mode. Every device can be contacted with this address.
Addresses 251...255 are reserved for subsequent developments.
· Function code: Function number
A function is selected and executed by the device via the function number. The function number is encoded in 7 bits. Bit 7 is
always 0. The functions are described further below.
· Parameters:
The parameters required by the function (n = 0 .. 6, according to function)
· CRC16: 16-bit checksum
These two check bytes serve to verify the integrity of the received data. If an error is established, the entire message will be
discarded. The principle employed for CRC16 calculation is described in the appendix. The CRC16 standard is applied here.
Note: The length of a message from the master is at least 4 bytes.this
每个方法参数有 0-6 可选,相似modbus协议spa
Function:48 (16进制为:30)
F48: Initialise devices, whereby the device ID is returned
命令:FA 30 04 433d
设备地址 | 方法代码 | 方法参数 | CRC校验 高位 | CRC校验 低位 |
---|---|---|---|---|
FA | 30 | 04 | 43 |
Function:73 (16进制为:49)
F73: Read out current pressure and temperature values in floating-point format
命令:FA 49 01 A1 A7
(还有其余方法根据本身所需数据本身去协议找)rest
设备地址 | 方法代码 | 方法参数 | CRC校验 高位 | CRC校验 低位 |
---|---|---|---|---|
FA | 49 | 01 | A1 | A7 |
返回数据格式为:code
设备地址 | 方法代码 | 方法参数 | CRC校验 高位 | CRC校验 低位 |
---|---|---|---|---|
FA | 49 | 01 | A1 | A7 |
方法代码 | 16进制形式 | 功能描述(英文) | 功能描述(中文) |
---|---|---|---|
F3 | Read out the current pressure and temperature values in MODBUS format | ||
F30 | 1e | Read out scaling values | 读取最大值 |
F31 | 1f | Write scaling values | |
F32 | 20 | Read out configurations | 读取配置 |
F33 | 21 | Write cinfigurations | 写入配置 |
F48 | 30 | Initialise devices, whereby the device ID is returned | 初始化设备,返回设备ID,询问连接 |
F66 | 42 | Programm bus address | 总线地址 |
F69 | 45 | Read out serial number | |
F73 | 49 | Read out current pressure and temperature values in floating-point format | 读取当前浮点型压力、温度数据 |
F74 | 4a | Read out current pressure and temperature values in integer format | 读取当前压力温度整形数据 |
F95 | 5f | Zeroing functions | 归零 |
F100 | 64 | Read out configurations | 读取配置 |
F101 | 65 | Write configurations | 写入配置 |
其中 B三、B二、B一、B0 一个八个十六进制字符,48 = 32 位,按照IEEE754规则表示的浮点数
其中第0位符号位S:1-9 一共8位(bytes)阶码E 9-32 一共23位表示尾数M 小数位 如:0.xxxxxx
整数位默认省略1,因此最后计算须要(-1)S(1+M)*2E-127orm
遵循IEEE754 浮点数定义:
IEEE754转化浮点数
def parsePressure(pressure): """ 压力数据格式为:FA 49 B3 B2 B1 B0 STAT CRC16_H CRC16_L FA 49 3F 81 61 ee 00 11 6f 解析返回压力,统一返回千帕-kpa,保留7位小数 0:KPA | 1: MPA | 3 PA | 5 bar :param pressure: :return: """ UNIT = { "KPa": 1, "MPa": 1000, "Pa": 0.001, "Bar": 100 } pressure16 = pressure[4:12] binAll = str(bin(int(pressure16, 16)))[2:] # binAll = binAll[2:] data = [x for x in binAll[:-24:-1]] data.reverse() binE = binAll[:-23] E = int(binE, 2) - 127 total = 1 for i, v in enumerate(data): total = total + int(v) * (2 ** -(i + 1)) pressure = total*(2**E) return pressure*UNIT["Bar"]
SeriaPort 类为继承serial 模块复写write/read 方法,(pip install pyserial)
from Lib.SerialPort import * import time import os import threading import binascii import re class PressureSensor(object): """ 压力传感器型号为:keller PAA-3XX/80794(绝压) 协议类型: KELLER protoco (类MODBUS 协议) Each message sent by the master possesses the following format: DevAddr | 0 Function code | n byte parameters (optional) |CRC16_H CRC16_L """ def __init__(self,com='COM14' ): self.seria = SerialPort(com,9600) self.last_str = "FA493F8161ee00116f" print('PressureSensor初始化成功') def readPressure(self): self.seria.Write(bytes.fromhex("FA 49 01 A1 A7")) pressurestr = str(binascii.b2a_hex(self.seria.Read()).decode()) self.last_str = pressurestr if pressurestr != '' else self.last_str return self.parsePressure(self.last_str) def parsePressure(self, pressure): """ 压力数据格式为:FA 49 B3 B2 B1 B0 STAT CRC16_H CRC16_L FA 49 3F 81 61 ee 00 11 6f 解析返回压力,统一返回千帕-kpa,保留7位小数 0:KPA | 1: MPA | 3 PA | 5 bar :param pressure: :return: """ UNIT = { "KPa": 1, "MPa": 1000, "Pa": 0.001, "Bar": 100 } pressure16 = pressure[4:12] binAll = str(bin(int(pressure16, 16)))[2:] # binAll = binAll[2:] data = [x for x in binAll[:-24:-1]] data.reverse() binE = binAll[:-23] E = int(binE, 2) - 127 total = 1 for i, v in enumerate(data): total = total + int(v) * (2 ** -(i + 1)) pressure = total*(2**E) return pressure*UNIT["Bar"]