mirror of
https://github.com/dptech-corp/Uni-Lab-OS.git
synced 2026-02-04 21:35:09 +00:00
Initial commit
This commit is contained in:
0
unilabos/device_comms/modbus_plc/test/__init__.py
Normal file
0
unilabos/device_comms/modbus_plc/test/__init__.py
Normal file
107
unilabos/device_comms/modbus_plc/test/client.py
Normal file
107
unilabos/device_comms/modbus_plc/test/client.py
Normal file
@@ -0,0 +1,107 @@
|
||||
import time
|
||||
from pymodbus.client import ModbusTcpClient
|
||||
from unilabos.device_comms.modbus_plc.node.modbus import Coil, HoldRegister
|
||||
from pymodbus.payload import BinaryPayloadDecoder
|
||||
from pymodbus.constants import Endian
|
||||
|
||||
# client = ModbusTcpClient('localhost', port=5020)
|
||||
client = ModbusTcpClient('192.168.3.2', port=502)
|
||||
|
||||
client.connect()
|
||||
|
||||
|
||||
coil1 = Coil(client=client, name='coil_test1', data_type=bool, address=4502*8)
|
||||
coil1.write(True)
|
||||
time.sleep(3)
|
||||
coil1.write(False)
|
||||
|
||||
|
||||
|
||||
coil1 = Coil(client=client, name='coil_test1', data_type=bool, address=4503*8)
|
||||
coil1.write(True)
|
||||
time.sleep(3)
|
||||
coil1.write(False)
|
||||
|
||||
|
||||
exit(0)
|
||||
|
||||
|
||||
|
||||
register1 = HoldRegister(client=client, name="test-1", address=7040)
|
||||
|
||||
|
||||
coil1 = Coil(client=client, name='coil_test1', address=7002*8)
|
||||
|
||||
|
||||
coil1.write(True)
|
||||
|
||||
while True:
|
||||
# result = client.read_holding_registers(address=7040, count=2, slave=1) # unit=1 是从站地址
|
||||
result = register1.read(2, slave=1)
|
||||
if result.isError():
|
||||
print("读取失败")
|
||||
else:
|
||||
print("读取成功:", result.registers)
|
||||
decoder = BinaryPayloadDecoder.fromRegisters(
|
||||
result.registers, byteorder=Endian.BIG, wordorder=Endian.LITTLE
|
||||
)
|
||||
real_value = decoder.decode_32bit_float()
|
||||
print("这里的值是: ", real_value)
|
||||
if real_value > 42:
|
||||
coil1.write(False)
|
||||
break
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
# # 创建 Modbus TCP 客户端,连接到本地模拟的服务器
|
||||
# client = ModbusClient('localhost', port=5020)
|
||||
|
||||
# # 连接到服务器
|
||||
|
||||
# # 读取保持寄存器(地址 0,读取 10 个寄存器)
|
||||
# # address: int,
|
||||
# # *,
|
||||
# # count: int = 1,
|
||||
# # slave: int = 1,
|
||||
# response = client.read_holding_registers(
|
||||
# address=0, count=10, slave=1
|
||||
# )
|
||||
|
||||
# response = coil1.read(2, slave=1)
|
||||
#
|
||||
# if response.isError():
|
||||
# print(f"Error reading registers: {response}")
|
||||
# else:
|
||||
# print(f"Read holding registers: {response.bits}")
|
||||
#
|
||||
# coil1.write(1, slave=1)
|
||||
# print("Wrote value 1234 to holding register 0")
|
||||
#
|
||||
# response = coil1.read(2, slave=1)
|
||||
# if response.isError():
|
||||
# print(f"Error reading registers: {response}")
|
||||
# else:
|
||||
# print(f"Read holding registers after write: {response.bits}")
|
||||
#
|
||||
#
|
||||
# if response.isError():
|
||||
# print(f"Error reading registers: {response}")
|
||||
# else:
|
||||
# print(f"Read holding registers after write: {response.bits}")
|
||||
|
||||
client.close()
|
||||
|
||||
# # 写入保持寄存器(地址 0,值为 1234)
|
||||
# client.write_register(0, 1234, slave=1)
|
||||
# print("Wrote value 1234 to holding register 0")
|
||||
|
||||
# # 再次读取寄存器,确认写入成功
|
||||
# response = client.read_holding_registers(address=0, count=10, slave=1)
|
||||
# if response.isError():
|
||||
# print(f"Error reading registers: {response}")
|
||||
# else:
|
||||
# print(f"Read holding registers after write: {response.registers}")
|
||||
|
||||
# # 关闭连接
|
||||
# client.close()
|
||||
|
||||
45
unilabos/device_comms/modbus_plc/test/node_test.py
Normal file
45
unilabos/device_comms/modbus_plc/test/node_test.py
Normal file
@@ -0,0 +1,45 @@
|
||||
# coding=utf-8
|
||||
from pymodbus.client import ModbusTcpClient
|
||||
from unilabos.device_comms.modbus_plc.node.modbus import Coil
|
||||
import time
|
||||
|
||||
|
||||
client = ModbusTcpClient('192.168.3.2', port=502)
|
||||
client.connect()
|
||||
|
||||
coil1 = Coil(client=client, name='0', address=7012*8)
|
||||
|
||||
coil2 = Coil(client=client, name='0', address=7062*8)
|
||||
coil3 = Coil(client=client, name='0', address=7054*8)
|
||||
|
||||
|
||||
while True:
|
||||
time.sleep(1)
|
||||
resp, isError = coil2.read(1)
|
||||
resp1, isError = coil3.read(1)
|
||||
print(resp[0], resp1[0])
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# hr = HoldRegister(client, '1', 100)
|
||||
# resp = hr.write([666.3, 777.4], data_type=DATATYPE.FLOAT32, word_order=WORDORDER.BIG)
|
||||
# print('write ===== hr1', resp)
|
||||
# time.sleep(1)
|
||||
# h_resp = hr.read(4, data_type=DATATYPE.FLOAT32, word_order=WORDORDER.BIG)
|
||||
# print('=======hr1', h_resp)
|
||||
#
|
||||
#
|
||||
# resp = hr.write([666, 777], data_type=DATATYPE.INT32, word_order=WORDORDER.BIG)
|
||||
# print('write ===== hr1', resp)
|
||||
# time.sleep(1)
|
||||
# h_resp = hr.read(4, data_type=DATATYPE.INT32, word_order=WORDORDER.BIG)
|
||||
# print('=======hr1', h_resp)
|
||||
#
|
||||
#
|
||||
# resp = hr.write('hello world!', data_type=DATATYPE.STRING, word_order=WORDORDER.BIG)
|
||||
# print('write ===== hr1', resp)
|
||||
# time.sleep(1)
|
||||
# h_resp = hr.read(12, data_type=DATATYPE.STRING, word_order=WORDORDER.BIG)
|
||||
# print('=======hr1', h_resp)
|
||||
42
unilabos/device_comms/modbus_plc/test/server.py
Normal file
42
unilabos/device_comms/modbus_plc/test/server.py
Normal file
@@ -0,0 +1,42 @@
|
||||
import modbus_tk.modbus_tcp as modbus_tcp
|
||||
import modbus_tk.defines as cst
|
||||
from modbus_tk.modbus import Slave
|
||||
|
||||
# 创建一个 Modbus TCP 服务器
|
||||
server = modbus_tcp.TcpServer(
|
||||
address="localhost", port=5020, timeout_in_sec=1
|
||||
)
|
||||
|
||||
# 设置服务器的地址和端口
|
||||
# server.set_address("localhost", 5020) # 监听在本地端口5020
|
||||
|
||||
# 添加一个从设备,Slave ID 设为 1
|
||||
slave: Slave = server.add_slave(1)
|
||||
|
||||
|
||||
# 向从设备添加一个保持寄存器块,假设从地址0开始,10个寄存器
|
||||
# def add_block(self, block_name, block_type, starting_address, size)
|
||||
# slave.add_block('0', cst.HOLDING_REGISTERS, 0, 10)
|
||||
|
||||
# 添加一个线圈
|
||||
# 0 名字, 从 16 字节内存位置开始,分配连续两个字节的内存大小,注意地址只能是 8 的整数倍
|
||||
slave.add_block('0', cst.COILS, 2*8, 2)
|
||||
|
||||
# 1 名字,100 起始地址, 8 是从 100 的位置分配 8 个字节内存, 两个线圈的量
|
||||
slave.add_block('1', cst.HOLDING_REGISTERS, 100, 8)
|
||||
slave.add_block('2', cst.HOLDING_REGISTERS, 200, 16)
|
||||
|
||||
# slave.add_block('2', cst.DISCRETE_INPUTS , 200, 2)
|
||||
# slave.add_block('3', cst.ANALOG_INPUTS , 300, 2)
|
||||
# 启动服务器
|
||||
server.start()
|
||||
|
||||
print("Modbus TCP server running on localhost:5020")
|
||||
|
||||
# 保持服务器运行,直到按下 Ctrl+C
|
||||
try:
|
||||
while True:
|
||||
pass
|
||||
except KeyboardInterrupt:
|
||||
server.stop()
|
||||
print("Server stopped.")
|
||||
168
unilabos/device_comms/modbus_plc/test/test_workflow.py
Normal file
168
unilabos/device_comms/modbus_plc/test/test_workflow.py
Normal file
@@ -0,0 +1,168 @@
|
||||
import time
|
||||
from typing import Callable
|
||||
from unilabos.device_comms.modbus_plc.client import TCPClient, ModbusWorkflow, WorkflowAction, load_csv
|
||||
from unilabos.device_comms.modbus_plc.node.modbus import Base as ModbusNodeBase
|
||||
|
||||
############ 第一种写法 ##############
|
||||
|
||||
|
||||
# modbus_tcp_client_test1 = TCPClient('192.168.3.2', 502)
|
||||
#
|
||||
#
|
||||
# node_list = [
|
||||
# ModbusNode(name="left_move_coli", device_type=DeviceType.COIL, address=7003 * 8),
|
||||
# ModbusNode(name="right_move_coli", device_type=DeviceType.COIL, address=7002 * 8),
|
||||
# ModbusNode(name="position_register", device_type=DeviceType.HOLD_REGISTER, address=7040),
|
||||
# ]
|
||||
#
|
||||
# def judge_position(node: ModbusNodeBase):
|
||||
# idx = 0
|
||||
# while idx <= 5:
|
||||
# result, is_err = node.read(2)
|
||||
# if is_err:
|
||||
# print("读取失败")
|
||||
# else:
|
||||
# print("读取成功:", result)
|
||||
# idx+=1
|
||||
# time.sleep(1)
|
||||
#
|
||||
# workflow_move_2_right = PLCWorkflow(name="测试水平向右移动", actions=[
|
||||
# lambda use_node: use_node('left_move_coli').write(False),
|
||||
# lambda use_node: use_node('right_move_coli').write(True),
|
||||
# lambda use_node: judge_position(use_node('position_register')),
|
||||
# lambda use_node: use_node('right_move_coli').write(False),
|
||||
# ])
|
||||
#
|
||||
#
|
||||
# workflow_move_2_left = PLCWorkflow(name="测试水平向左移动", actions=[
|
||||
# lambda use_node: use_node('right_move_coli').write(False),
|
||||
# lambda use_node: use_node('left_move_coli').write(True),
|
||||
# lambda use_node: judge_position(use_node('position_register')),
|
||||
# lambda use_node: use_node('left_move_coli').write(False),
|
||||
# ])
|
||||
#
|
||||
#
|
||||
# workflow_test_1 = PLCWorkflow(name="测试水平移动并停止", actions=[
|
||||
# workflow_move_2_right,
|
||||
# workflow_move_2_left,
|
||||
# ])
|
||||
#
|
||||
# modbus_tcp_client_test1 \
|
||||
# .register_node_list(node_list) \
|
||||
# .run_plc_workflow(workflow_test_1)
|
||||
#
|
||||
|
||||
|
||||
############ 第二种写法 ##############
|
||||
|
||||
modbus_tcp_client_test2 = TCPClient('192.168.3.2', 502)
|
||||
|
||||
# def judge_position(node: ModbusNodeBase):
|
||||
# idx = 0
|
||||
# while idx <= 5:
|
||||
# result, is_err = node.read(2)
|
||||
# if is_err:
|
||||
# print("读取失败")
|
||||
# else:
|
||||
# print("读取成功:", result)
|
||||
# idx+=1
|
||||
# time.sleep(1)
|
||||
|
||||
|
||||
|
||||
# def move_2_right_init(use_node: Callable[[str], ModbusNodeBase]) -> bool:
|
||||
# use_node('left_move_coli').write(False)
|
||||
# use_node('right_move_coli').write(True)
|
||||
# return True
|
||||
|
||||
# def move_2_right_start(use_node: Callable[[str], ModbusNodeBase]) -> bool:
|
||||
# judge_position(use_node('position_register'))
|
||||
# return True
|
||||
|
||||
# def move_2_right_stop(use_node: Callable[[str], ModbusNodeBase]) -> bool:
|
||||
# use_node('right_move_coli').write(False)
|
||||
# return True
|
||||
|
||||
# move_2_right_workflow = ModbusWorkflow(name="测试水平向右移动", actions=[WorkflowAction(
|
||||
# init=move_2_right_init,
|
||||
# start=move_2_right_start,
|
||||
# stop=move_2_right_stop,
|
||||
# )])
|
||||
|
||||
# move_2_right_workflow = ModbusWorkflow(name="测试水平向右移动", actions=[WorkflowAction(
|
||||
# init=move_2_right_init,
|
||||
# start= None,
|
||||
# stop= None,
|
||||
# cleanup=None,
|
||||
# )])
|
||||
|
||||
|
||||
def idel_init(use_node: Callable[[str], ModbusNodeBase]) -> bool:
|
||||
# 修改速度
|
||||
use_node('M01_idlepos_velocity_rw').write(20.0)
|
||||
# 修改位置
|
||||
# use_node('M01_idlepos_position_rw').write(35.22)
|
||||
return True
|
||||
|
||||
def idel_position(use_node: Callable[[str], ModbusNodeBase]) -> bool:
|
||||
use_node('M01_idlepos_coil_w').write(True)
|
||||
while True:
|
||||
pos_idel, idel_err = use_node('M01_idlepos_coil_r').read(1)
|
||||
pos_stop, stop_err = use_node('M01_manual_stop_coil_r').read(1)
|
||||
time.sleep(0.5)
|
||||
if not idel_err and not stop_err and pos_idel[0] and pos_stop[0]:
|
||||
break
|
||||
|
||||
return True
|
||||
|
||||
def idel_stop(use_node: Callable[[str], ModbusNodeBase]) -> bool:
|
||||
use_node('M01_idlepos_coil_w').write(False)
|
||||
return True
|
||||
|
||||
move_idel= ModbusWorkflow(name="测试待机位置", actions=[WorkflowAction(
|
||||
init=idel_init,
|
||||
start=idel_position,
|
||||
stop=idel_stop,
|
||||
)])
|
||||
|
||||
def pipetter_init(use_node: Callable[[str], ModbusNodeBase]) -> bool:
|
||||
# 修改速度
|
||||
# use_node('M01_idlepos_velocity_rw').write(10.0)
|
||||
# 修改位置
|
||||
# use_node('M01_idlepos_position_rw').write(35.22)
|
||||
return True
|
||||
|
||||
def pipetter_position(use_node: Callable[[str], ModbusNodeBase]) -> bool:
|
||||
use_node('M01_pipette0_coil_w').write(True)
|
||||
while True:
|
||||
pos_idel, isError = use_node('M01_pipette0_coil_r').read(1)
|
||||
pos_stop, isError = use_node('M01_manual_stop_coil_r').read(1)
|
||||
time.sleep(0.5)
|
||||
if pos_idel[0] and pos_stop[0]:
|
||||
break
|
||||
|
||||
return True
|
||||
|
||||
def pipetter_stop(use_node: Callable[[str], ModbusNodeBase]) -> bool:
|
||||
use_node('M01_pipette0_coil_w').write(False)
|
||||
return True
|
||||
|
||||
move_pipetter= ModbusWorkflow(name="测试待机位置", actions=[WorkflowAction(
|
||||
init=None,
|
||||
start=pipetter_position,
|
||||
stop=pipetter_stop,
|
||||
)])
|
||||
|
||||
|
||||
|
||||
workflow_test_2 = ModbusWorkflow(name="测试水平移动并停止", actions=[
|
||||
move_idel,
|
||||
move_pipetter,
|
||||
])
|
||||
|
||||
nodes = load_csv('/Users/dingshinn/Desktop/lbg/uni-lab/M01.csv')
|
||||
|
||||
modbus_tcp_client_test2 \
|
||||
.register_node_list(nodes) \
|
||||
.run_modbus_workflow(workflow_test_2)
|
||||
# .run_modbus_workflow(move_2_left_workflow)
|
||||
Reference in New Issue
Block a user