- keller英文版通讯协议百度网盘:提取码:fusc
-
广播模式:所有从机都会收到上位机信息
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. -
只有单一从机收到:
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. -
如下数据格式:
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.
- 命令字符串格式:
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:
设备地址 | 方法代码 | 方法参数 | 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.
每一个方法参数有 0-6 可选,类似modbus协议
Function:48 (16进制为:30)
F48: Initialise devices, whereby the device ID is returned
命令:FA 30 04 43
设备地址 | 方法代码 | 方法参数 | 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
(还有其他方法根据自己所需数据自己去协议找)
设备地址 | 方法代码 | 方法参数 | CRC校验 高位 | CRC校验 低位 |
---|---|---|---|---|
FA | 49 | 01 | A1 | A7 |
返回数据格式为:
设备地址 | 方法代码 | 方法参数 | 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 | 写入配置 |
- 返回数据格式:
其中 B3、B2、B1、B0 一个八个十六进制字符,48 = 32 位,按照IEEE754规则表示的浮点数
其中第0位符号位S:1-9 一共8位(bytes)阶码E 9-32 一共23位表示尾数M 小数位 如:0.xxxxxx
整数位默认省略1,所以最后计算需要(-1)S(1+M)*2E-127
遵循IEEE754 浮点数定义:
IEEE754转化浮点数
- python 现成代码:楼主自己项目里面使用的
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"]