186 lines
6.6 KiB
Python
186 lines
6.6 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
VWED在线脚本Modbus使用示例
|
||
演示如何在脚本中使用Modbus功能
|
||
"""
|
||
|
||
import sys
|
||
import os
|
||
import time
|
||
|
||
# 添加项目根目录到路径
|
||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
||
|
||
from services.online_script.script_vwed_objects import create_vwed_object
|
||
|
||
|
||
def modbus_script_example():
|
||
"""模拟在线脚本中使用Modbus功能"""
|
||
|
||
print("VWED在线脚本 - Modbus使用示例")
|
||
print("="*50)
|
||
|
||
# 创建VWED对象(模拟脚本环境)
|
||
VWED = create_vwed_object("example_script")
|
||
|
||
# Modbus服务器配置
|
||
MODBUS_HOST = "localhost"
|
||
MODBUS_PORT = 5020
|
||
SLAVE_ID = 1
|
||
|
||
print(f"连接到Modbus服务器: {MODBUS_HOST}:{MODBUS_PORT}")
|
||
print(f"从站ID: {SLAVE_ID}")
|
||
|
||
# 示例1: 基础读取操作
|
||
print("\n示例1: 基础读取操作")
|
||
print("-" * 30)
|
||
|
||
# 读取保持寄存器
|
||
value = VWED.modbus.read_holding_register(MODBUS_HOST, MODBUS_PORT, SLAVE_ID, 0, 2)
|
||
print(f"保持寄存器[0]: {value}")
|
||
|
||
# 读取输入寄存器
|
||
value = VWED.modbus.read_input_register(MODBUS_HOST, MODBUS_PORT, SLAVE_ID, 0, 2)
|
||
print(f"输入寄存器[0]: {value}")
|
||
|
||
# 读取线圈状态
|
||
value = VWED.modbus.read_coil_status(MODBUS_HOST, MODBUS_PORT, SLAVE_ID, 0)
|
||
print(f"线圈[0]: {value}")
|
||
|
||
# 读取离散输入
|
||
value = VWED.modbus.read_input_status(MODBUS_HOST, MODBUS_PORT, SLAVE_ID, 0)
|
||
print(f"离散输入[0]: {value}")
|
||
|
||
# 示例2: 批量读取操作
|
||
print("\n示例2: 批量读取操作")
|
||
print("-" * 30)
|
||
|
||
# 批量读取保持寄存器
|
||
values = VWED.modbus.batch_read_holding_registers(MODBUS_HOST, MODBUS_PORT, SLAVE_ID, 0, 5)
|
||
print(f"保持寄存器[0-4]: {values}")
|
||
|
||
# 批量读取输入寄存器
|
||
values = VWED.modbus.batch_read_input_registers(MODBUS_HOST, MODBUS_PORT, SLAVE_ID, 0, 5)
|
||
print(f"输入寄存器[0-4]: {values}")
|
||
|
||
# 示例3: 写入操作
|
||
print("\n示例3: 写入操作")
|
||
print("-" * 30)
|
||
|
||
# 写入保持寄存器
|
||
success = VWED.modbus.write_holding_register(MODBUS_HOST, MODBUS_PORT, SLAVE_ID, 0, 2, 12345)
|
||
print(f"写入保持寄存器[0] = 12345: {'成功' if success else '失败'}")
|
||
|
||
# 验证写入结果
|
||
value = VWED.modbus.read_holding_register(MODBUS_HOST, MODBUS_PORT, SLAVE_ID, 0, 2)
|
||
print(f"验证读取结果: {value}")
|
||
|
||
# 写入线圈
|
||
success = VWED.modbus.write_coil_status(MODBUS_HOST, MODBUS_PORT, SLAVE_ID, 1, True)
|
||
print(f"写入线圈[1] = True: {'成功' if success else '失败'}")
|
||
|
||
# 验证写入结果
|
||
value = VWED.modbus.read_coil_status(MODBUS_HOST, MODBUS_PORT, SLAVE_ID, 1)
|
||
print(f"验证读取结果: {value}")
|
||
|
||
# 示例4: 批量写入操作
|
||
print("\n示例4: 批量写入操作")
|
||
print("-" * 30)
|
||
|
||
# 批量写入保持寄存器
|
||
test_values = [1000, 2000, 3000, 4000, 5000]
|
||
success = VWED.modbus.batch_write_holding_register(MODBUS_HOST, MODBUS_PORT, SLAVE_ID, 0, test_values)
|
||
print(f"批量写入保持寄存器[0-4]: {'成功' if success else '失败'}")
|
||
|
||
# 验证结果
|
||
values = VWED.modbus.batch_read_holding_registers(MODBUS_HOST, MODBUS_PORT, SLAVE_ID, 0, 5)
|
||
print(f"验证读取结果: {values}")
|
||
|
||
# 批量写入线圈
|
||
coil_values = [True, False, True, False, True]
|
||
success = VWED.modbus.batch_write_coil_status(MODBUS_HOST, MODBUS_PORT, SLAVE_ID, 0, coil_values)
|
||
print(f"批量写入线圈[0-4]: {'成功' if success else '失败'}")
|
||
|
||
# 验证结果
|
||
values = VWED.modbus.batch_read_coil_status(MODBUS_HOST, MODBUS_PORT, SLAVE_ID, 0, 5)
|
||
print(f"验证读取结果: {values}")
|
||
|
||
# 示例5: 通用读写操作
|
||
print("\n示例5: 通用读写操作")
|
||
print("-" * 30)
|
||
|
||
# 使用通用方法读取不同类型的地址
|
||
type_names = {
|
||
'0x': '线圈',
|
||
'1x': '离散输入',
|
||
'3x': '输入寄存器',
|
||
'4x': '保持寄存器'
|
||
}
|
||
|
||
for type_str, name in type_names.items():
|
||
value = VWED.modbus.read_single_modbus_value(MODBUS_HOST, MODBUS_PORT, SLAVE_ID, type_str, 0)
|
||
print(f"{name}[0] (类型{type_str}): {value}")
|
||
|
||
# 通用写入(只对可写类型)
|
||
success = VWED.modbus.write_single_modbus_value(MODBUS_HOST, MODBUS_PORT, SLAVE_ID, '4x', 10, 9999)
|
||
print(f"通用写入保持寄存器[10] = 9999: {'成功' if success else '失败'}")
|
||
|
||
# 示例6: 使用预配置实例
|
||
print("\n示例6: 使用预配置实例")
|
||
print("-" * 30)
|
||
|
||
# 配置一个Modbus实例
|
||
VWED.modbus.configure_modbus_instance("PLC1", MODBUS_HOST, MODBUS_PORT, SLAVE_ID, "4x")
|
||
print("已配置实例: PLC1")
|
||
|
||
# 使用实例名称进行操作
|
||
value = VWED.modbus.read_single_modbus_value_by_instance_name("PLC1", 0)
|
||
print(f"通过实例PLC1读取[0]: {value}")
|
||
|
||
success = VWED.modbus.write_single_modbus_value_by_instance_name("PLC1", 0, 8888)
|
||
print(f"通过实例PLC1写入[0] = 8888: {'成功' if success else '失败'}")
|
||
|
||
# 验证结果
|
||
value = VWED.modbus.read_single_modbus_value_by_instance_name("PLC1", 0)
|
||
print(f"验证结果: {value}")
|
||
|
||
# 示例7: 模拟实际应用场景
|
||
print("\n示例7: 模拟实际应用场景")
|
||
print("-" * 30)
|
||
|
||
# 配置多个设备实例
|
||
VWED.modbus.configure_modbus_instance("温度传感器", MODBUS_HOST, MODBUS_PORT, SLAVE_ID, "3x")
|
||
VWED.modbus.configure_modbus_instance("控制器", MODBUS_HOST, MODBUS_PORT, SLAVE_ID, "4x")
|
||
|
||
# 读取传感器数据
|
||
temperature = VWED.modbus.read_single_modbus_value_by_instance_name("温度传感器", 0)
|
||
humidity = VWED.modbus.read_single_modbus_value_by_instance_name("温度传感器", 1)
|
||
print(f"温度: {temperature}, 湿度: {humidity}")
|
||
|
||
# 根据传感器数据控制设备
|
||
if temperature and temperature > 150: # 假设温度过高
|
||
# 启动冷却系统
|
||
success = VWED.modbus.write_single_modbus_value_by_instance_name("控制器", 0, 1)
|
||
print(f"温度过高({temperature}),启动冷却系统: {'成功' if success else '失败'}")
|
||
else:
|
||
# 关闭冷却系统
|
||
success = VWED.modbus.write_single_modbus_value_by_instance_name("控制器", 0, 0)
|
||
print(f"温度正常({temperature}),关闭冷却系统: {'成功' if success else '失败'}")
|
||
|
||
print("\n示例脚本执行完成!")
|
||
|
||
|
||
def main():
|
||
"""主函数"""
|
||
try:
|
||
modbus_script_example()
|
||
except Exception as e:
|
||
print(f"脚本执行出错: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main() |