receiver104.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. from c104 import Client
  2. import time
  3. import logging
  4. # 配置日志
  5. logging.basicConfig(
  6. level=logging.INFO,
  7. format='%(asctime)s - %(levelname)s - %(message)s'
  8. )
  9. logger = logging.getLogger(__name__)
  10. class EnvisionDataReceiver:
  11. def __init__(self, server_ip, server_port=2404):
  12. """
  13. 初始化远景数据接收器
  14. :param server_ip: 远景系统服务器IP
  15. :param server_port: IEC104端口,默认2404
  16. """
  17. self.server_ip = server_ip
  18. self.server_port = server_port
  19. self.client = None
  20. def on_connect(self, connection):
  21. """连接成功回调"""
  22. logger.info(f"成功连接到远景系统 {connection}")
  23. def on_disconnect(self, connection):
  24. """断开连接回调"""
  25. logger.warning(f"与远景系统断开连接 {connection}")
  26. def on_telemetry(self, asdu_address, io_address, value, quality, time):
  27. """
  28. 接收遥测数据回调
  29. :param asdu_address: ASDU地址
  30. :param io_address: 信息对象地址
  31. :param value: 值 (归一化值/标度化值/短浮点数)
  32. :param quality: 质量描述符
  33. :param time: 时间标签(CP56Time2a格式)
  34. """
  35. timestamp = time.to_datetime() if time else None
  36. logger.info(f"遥测数据 - ASDU:{asdu_address} IO:{io_address} 值:{value:.2f} 质量:{quality} 时间:{timestamp}")
  37. def on_telecommand(self, asdu_address, io_address, state, quality, time):
  38. """
  39. 接收遥信数据回调
  40. :param asdu_address: ASDU地址
  41. :param io_address: 信息对象地址
  42. :param state: 状态 (单点/双点)
  43. :param quality: 质量描述符
  44. :param time: 时间标签(CP56Time2a格式)
  45. """
  46. timestamp = time.to_datetime() if time else None
  47. logger.info(f"遥信数据 - ASDU:{asdu_address} IO:{io_address} 状态:{state} 质量:{quality} 时间:{timestamp}")
  48. def start(self):
  49. """启动客户端连接"""
  50. try:
  51. # 创建IEC104客户端
  52. self.client = Client()
  53. self.client.add_connection(self.server_ip,self.server_port)
  54. # 设置回调函数
  55. self.client.on_connect = self.on_connect
  56. self.client.on_disconnect = self.on_disconnect
  57. self.client.on_telemetry = self.on_telemetry
  58. self.client.on_telecommand = self.on_telecommand
  59. # 启动连接
  60. self.client.start()
  61. logger.info(f"开始连接远景系统 {self.server_ip}:{self.server_port}...")
  62. # 保持主线程运行
  63. while True:
  64. time.sleep(1)
  65. except KeyboardInterrupt:
  66. self.stop()
  67. except Exception as e:
  68. logger.error(f"发生错误: {str(e)}")
  69. self.stop()
  70. raise e
  71. def stop(self):
  72. """停止客户端"""
  73. if self.client:
  74. self.client.stop()
  75. logger.info("已停止IEC104客户端")
  76. if __name__ == "__main__":
  77. # 配置远景系统服务器IP和端口
  78. ENVISION_IP = "192.168.50.242" # 替换为远景系统实际IP
  79. ENVISION_PORT = 2404
  80. receiver = EnvisionDataReceiver(ENVISION_IP, ENVISION_PORT)
  81. receiver.start()