博客

原型与Modbus

python程序员编写代码,java脚本,笔记本屏幕上html代码
亚历克斯Pohjanpelto
亚历克斯Pohjanpelto
发表: 2021年9月7日
工业制造和流程
beplay充值的钱可以工业测量
生命科学

你原型,或寻找一种可行的方法测量湿度和温度在您的应用程序在不影响测量的质量?你也有一些关于编程语言的基本知识,如Python ?如果是这样,我希望自己可以很容易地展示你日志数据长时间只有一个HMP110探针,一个USB供电电缆(219690)和一台电脑安装了Python 3。我将带您亲历不同部分的代码,但是如果你不喜欢解释,你可以跳过整个代码底部。我还想指出,这只是一个示例脚本演示Modbus通信。

代码之前,我们先介绍我们将利用图书馆,pymodbus最重要的一个。我们使用它与探测器通过Modbus RTU通信,我们将更具体地从pymodbus.client.sync进口ModbusSerialClient。我们使用结构库操作到不同的变量类型,改变图书馆的时间调查,datetime库的数据阅读,时间和日期,我们进口argparse将从命令行参数传递给代码。

从pymodbus.client。同步导入ModbusSerialClient ModbusClient
进口结构
导入的时间
进口日期时间
进口argparse

参数

我已经添加了一些参数帮助代码的灵活性。我们使用这些,这样我们可以很容易地更改变量的值从命令行,而无需修改代码。的参数,我想可能是有用的通信端口,文件的名称,数据存储,奴隶地址的调查,民意测验率,数据记录长度。

解析器= argparse.ArgumentParser (
描述= " Modbus数据记录器"
)
解析器。add_argument(“端口”,帮助=“探头连接的串行通讯端口”)
解析器。add_argument (“- f”,“——文件”,帮助=“文件名存储数据(默认data.csv)”默认=“data.csv”)
解析器。add_argument(“——”“——地址”,帮助=”探测器的地址(默认240)”、默认= 240 = int类型)
解析器。add_argument (' - r ',”——率”,帮助=“秒的民意测验率”(默认为1),默认= 1,类型=浮动)
解析器。add_argument (“- l”,“——长度”,帮助=“小时数据日志的时间(默认9999999)”类型=浮动,默认= 9999999)
args = parser.parse_args ()

网络通讯协议的连接

我们首先需要初始化一个新的串行Modbus客户机使用正确的设置为我们的调查。参数的设置在这个例子中必须包括沟通的方法、通信端口、响应超时,波特率、停止位和奇偶校验。方法对Modbus rtu的rtu,港口取决于你的电脑所以我将解释在下面一节中,如何确定正确的一个。其他参数是由探测器的设置,所以你需要参考适当的值的数据表。通常Vaisala探针,波特率是19200,停止位是2,平价是没有的。

探针= ModbusClient(方法= rtu,端口=参数。港口,超时= 1,波特率= 19200,stopbits = 2,平价= ' N ')

阅读控股寄存器

现在让我们创建一个函数来读取寄存器的探针。我们称之为read_holding_registers()方法,我们在前一节中创建的网络通讯协议客户端实例读取寄存器。我们需要指定起始地址的存储寄存器,寄存器的数量和奴隶地址的调查。我们将接收数据寄存器的16位字在低位优先的格式,然后我们必须转换为32位浮点值。

def holding_registers_data ():
试一试:
寄存器=调查。read_holding_registers(地址= 0,数= 10,单位= args.address) .registers
除了例外e:
打印(e)
返回False,没有,没有,没有
试一试:
rh = data_from_register(寄存器,1)
t = data_from_register(寄存器,3)
dp = data_from_register(寄存器,9)

除了例外e:
打印(e)
返回False,没有,没有,没有
返回True, rh, t, dp

转换为32位的寄存器值

寄存器是存储为16位整数,我们需要将它们转换为32位浮点数。我创建了一个函数,把寄存器值和寄存器指数,并返回一个32位浮点值的数据索引。我们利用模块结构来执行这种转换

def data_from_register(寄存器,我):
返回struct.unpack (”!f ', bytes.fromhex (' {0:04x} ' .format(寄存器[我])+“{0:04x}”.format(寄存器(张))))[0]

日志数据

现在我们可以阅读控股寄存器和值转换为32位浮点值,我们需要创建一个函数的值存储在. csv文件。我已经创建了一个名为data_logger()函数。它调用函数holding_registers_data()和附加的接收的数据到一个文件格式的日期时间,相对湿度、温度、露点。

def data_logger ():
probe.connect ()
成功,rh, t, dp = holding_registers_data ()
如果(成功):
dt = datetime.datetime.now ()

试一试:
张开(arg游戏。文件,“a”) f:
行= f”{dt}, {rh}, {t}, {dp} \ n”
print(线)
f.write(线)
除了例外e:
打印(e)
probe.close ()
time . sleep (args.rate)

其他:
probe.close ()
time . sleep (0.5)

确定调查的通信端口

首先,确保你的探针是正确地连接到你的电脑。

窗户
在Windows操作系统中,您可以找到设备管理器下的COM端口的设备。打开设备管理器窗口,打开开始菜单在屏幕的左下角和类型在“设备管理器”。它应该出现在最上端的“最佳匹配”下,打开点击图标或按键盘输入。点击旁边的箭头港口(COM和涡轮)扩大港口。应该有一个设备列为“Vaisala USB设备”列出的COM端口下,在我们的案例中COM6。

图像
确定调查的通信端口

Linux
在Linux中可以确定通信端口通过键入命令“dmesg | grep tty”终端。它应该返回,除此之外,声明类似于“cp210x转换器现在连着ttyUSBn”,其中ttyUSBn是港口。

运行代码

为了运行这个脚本,您必须安装的所有库。如果需要,您可以使用脉冲命令

pip3 - u pymodbus安装
安装pymodbus。其他库应该已经具备python 3包。
在命令提示符下,导航到他们python脚本的目录存储和类型
python Modbus_RTU - h

寻求帮助的参数。这应该出现在命令提示符。下面是一个输出的截图。

图像
终端

的唯一参数是必需的通信端口,而其他参数的默认值可以改变根据你的喜好。通信端口参数不需要标识符和文件名后可以放置在任何地方。其他的参数是可选的,需要一个标识符。
这是一个典型的命令在长时间运行和短形式:

Python。\ Modbus_RTU datalog——文件。csv——地址240——10——48 COM6长度
Python。\ Modbus_RTU - f datalog。csv——240 - r - l 48 COM6

下载整个代码看Modbus 101网络研讨会。

添加新评论