modbus_rt.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. import _modbus_rt
  2. import modbus_rt_defines as cst
  3. LITTLE_ENDIAL_SWAP = 0
  4. BIG_ENDIAL_SWAP = 1
  5. LITTLE_ENDIAL = 2
  6. BIG_ENDIAL = 3
  7. SLAVE = 0
  8. MASTER = 1
  9. SOCK_STREAM = 1
  10. SOCK_DGRAM = 2
  11. class data_trans(_modbus_rt._data_trans):
  12. def reg2reg(self, val: int):
  13. return self._reg2reg(val)
  14. def regs2regs(self, val: list):
  15. return self._regs2regs(val)
  16. def regs2bytes(self, val: list, mode = LITTLE_ENDIAL_SWAP):
  17. if type(val) != list:
  18. print("para only for type list")
  19. return
  20. return self._regs2bytes(val, mode)
  21. def regs2str(self, val: list, mode = LITTLE_ENDIAL_SWAP):
  22. return self._regs2str(val, mode)
  23. def regs2signed(self, val: list, mode = LITTLE_ENDIAL_SWAP):
  24. return self._regs2signed(val, mode)
  25. def regs2int(self, val: list, mode = LITTLE_ENDIAL_SWAP):
  26. return self._regs2uint(val, mode)
  27. def regs2uint(self, val: list, mode = LITTLE_ENDIAL_SWAP):
  28. return self._regs2int(val, mode)
  29. def regs2long(self, val: list, mode = LITTLE_ENDIAL_SWAP):
  30. return self._regs2long(val, mode)
  31. def regs2float(self, val: list, mode = LITTLE_ENDIAL_SWAP):
  32. return self._regs2float(val, mode)
  33. def regs2double(self, val: list, mode = LITTLE_ENDIAL_SWAP):
  34. return self._regs2double(val, mode)
  35. def bytes2regs(self, val: any, mode = LITTLE_ENDIAL_SWAP):
  36. return self._bytes2regs(val, mode)
  37. def str2regs(self, val: str, mode = LITTLE_ENDIAL_SWAP):
  38. return self._str2regs(val, mode)
  39. def signed2regs(self, val: list, mode = LITTLE_ENDIAL_SWAP):
  40. return self._signed2regs(val, mode)
  41. def int2regs(self, val: list, mode = LITTLE_ENDIAL_SWAP):
  42. return self._int2regs(val, mode)
  43. def uint2regs(self, val: list, mode = LITTLE_ENDIAL_SWAP):
  44. return self._uint2regs(val, mode)
  45. def long2regs(self, val: list, mode = LITTLE_ENDIAL_SWAP):
  46. return self._long2regs(val, mode)
  47. def float2regs(self, val: list, mode = LITTLE_ENDIAL_SWAP):
  48. return self._float2regs(val, mode)
  49. def double2regs(self, val: list, mode = LITTLE_ENDIAL_SWAP):
  50. return self._double2regs(val, mode)
  51. class rtu(_modbus_rt._rtu):
  52. mode = SLAVE
  53. ascii_flag = 0
  54. def __init__(self, mode = SLAVE):
  55. return self._init(mode)
  56. def set_serial(self, devname: str, baudrate = 115200, bytesize = 8, parity = 'N', stopbits = 1, xonxoff = 0):
  57. return self._set_serial(devname, baudrate, bytesize, parity, stopbits, xonxoff)
  58. def set_over_type(self, over_type: int):
  59. return self._set_over_type(over_type)
  60. def set_net(self, ip = '', port = 502, type = SOCK_STREAM):
  61. return self._set_net(ip, port, type)
  62. def set_ip(self, ip: str):
  63. return self._set_ip(ip)
  64. def set_port(self, port: int):
  65. return self._set_port(port)
  66. def set_type(self, type: int):
  67. return self._set_type(type)
  68. def set_p2p(self, p2p_flag: int):
  69. return self._set_p2p(p2p_flag)
  70. def open(self):
  71. return self._open()
  72. def isopen(self):
  73. return self._isopen()
  74. def close(self):
  75. return self._close()
  76. # 该函数仅对从机有效
  77. def set_addr(self, addr: int):
  78. return self._slave_set_addr(addr)
  79. # 该函数仅对从机有效
  80. def set_strict(self, strict: int):
  81. return self._slave_set_strict(strict)
  82. # 该函数仅对从机有效
  83. def add_block(self, name: str, type: int, addr: int, nums: int):
  84. return self._slave_add_block(name, type, addr, nums)
  85. # 该函数仅对从机有效
  86. def regs_binding(self, regs: bytes, type: int, addr: int, nums: int):
  87. return self._slave_regs_binding(regs, type, addr, nums)
  88. # 该函数仅对从机有效
  89. def set_pre_ans_callback(self, cb):
  90. return self._slave_set_pre_ans_callback(cb)
  91. # 该函数仅对从机有效
  92. def set_done_callback(self, cb):
  93. return self._slave_set_done_callback(cb)
  94. # 该函数仅对从机有效
  95. def set_dev_binding(self, flag: int):
  96. return self._slave_set_dev_binding(flag)
  97. # 该函数仅对主机有效
  98. def set_server(self, saddr: str,sport: int):
  99. return self._master_set_server(saddr,sport)
  100. # 该函数仅对主机有效
  101. def get_saddr(self):
  102. return self._master_get_saddr()
  103. def excuse(self, dir_slave: int, type_function: int, addr: int, *val):
  104. if self.mode == SLAVE:
  105. if dir_slave == 0 :
  106. return self._slave_read_regs(type_function, addr, *val)
  107. elif dir_slave == 1 :
  108. return self._slave_write_regs(type_function, addr, *val)
  109. else :
  110. return
  111. elif self.mode == MASTER:
  112. if type_function >= cst.READ_COILS and type_function <= cst.READ_INPUT_REGISTERS:
  113. return self._master_read_list(dir_slave,type_function, addr, *val)
  114. elif type_function >= cst.WRITE_SINGLE_COIL and type_function <= cst.WRITE_SINGLE_REGISTER:
  115. return self._master_write_int(dir_slave,type_function, addr, *val)
  116. elif type_function >= cst.WRITE_MULTIPLE_COILS and type_function <= cst.WRITE_MULTIPLE_REGISTERS:
  117. return self._master_write_list(dir_slave,type_function, addr, *val)
  118. else :
  119. return
  120. else :
  121. return
  122. # 该函数仅对主机有效
  123. def download(self, slave: int, file_dev: str, file_master: str):
  124. return self._master_download(slave, file_dev, file_master)
  125. # 该函数仅对主机有效
  126. def upload(self, slave: int, file_dev: str, file_master: str):
  127. return self._master_upload(slave, file_dev, file_master)
  128. class ascii(rtu):
  129. mode = SLAVE
  130. ascii_flag = 0
  131. class tcp(_modbus_rt._tcp):
  132. mode = SLAVE
  133. def __init__(self, mode = SLAVE):
  134. return self._init(mode)
  135. def set_net(self, ip = '', port = 502, type = SOCK_STREAM):
  136. return self._set_net(ip, port, type)
  137. def set_ip(self, ip: str):
  138. return self._set_ip(ip)
  139. def set_port(self, port: int):
  140. return self._set_port(port)
  141. def set_type(self, type: int):
  142. return self._set_type(type)
  143. def set_p2p(self, p2p_flag: int):
  144. return self._set_p2p(p2p_flag)
  145. def open(self):
  146. return self._open()
  147. def isopen(self):
  148. return self._isopen()
  149. def close(self):
  150. return self._close()
  151. # 该函数仅对从机有效
  152. def set_addr(self, addr: int):
  153. return self._slave_set_addr(addr)
  154. # 该函数仅对从机有效
  155. def set_strict(self, strict: int):
  156. return self._slave_set_strict(strict)
  157. # 该函数仅对从机有效
  158. def add_block(self, name: str, type: int, addr: int, nums: int):
  159. return self._slave_add_block(name, type, addr, nums)
  160. # 该函数仅对从机有效
  161. def regs_binding(self, regs: bytes, type: int, addr: int, nums: int):
  162. return self._slave_regs_binding(regs, type, addr, nums)
  163. # 该函数仅对从机有效
  164. def set_pre_ans_callback(self, cb):
  165. return self._slave_set_pre_ans_callback(cb)
  166. # 该函数仅对从机有效
  167. def set_done_callback(self, cb):
  168. return self._slave_set_done_callback(cb)
  169. # 该函数仅对从机有效
  170. def set_dev_binding(self, flag: int):
  171. return self._slave_set_dev_binding(flag)
  172. # 该函数仅对主机有效
  173. def set_server(self, saddr: str,sport: int):
  174. return self._master_set_server(saddr,sport)
  175. # 该函数仅对主机有效
  176. def get_saddr(self):
  177. return self._master_get_saddr()
  178. def excuse(self, dir_slave: int, type_function: int, addr: int, *val):
  179. if self.mode == SLAVE:
  180. if dir_slave == 0 :
  181. return self._slave_read_regs(type_function, addr, *val)
  182. elif dir_slave == 1 :
  183. return self._slave_write_regs(type_function, addr, *val)
  184. else :
  185. return
  186. elif self.mode == MASTER:
  187. if type_function >= cst.READ_COILS and type_function <= cst.READ_INPUT_REGISTERS:
  188. return self._master_read_list(dir_slave,type_function, addr, *val)
  189. elif type_function >= cst.WRITE_SINGLE_COIL and type_function <= cst.WRITE_SINGLE_REGISTER:
  190. return self._master_write_int(dir_slave,type_function, addr, *val)
  191. elif type_function >= cst.WRITE_MULTIPLE_COILS and type_function <= cst.WRITE_MULTIPLE_REGISTERS:
  192. return self._master_write_list(dir_slave,type_function, addr, *val)
  193. else :
  194. return
  195. else :
  196. return
  197. # 该函数仅对主机有效
  198. def download(self, slave: int, file_dev: str, file_master: str):
  199. return self._master_download(slave, file_dev, file_master)
  200. # 该函数仅对主机有效
  201. def upload(self, slave: int, file_dev: str, file_master: str):
  202. return self._master_upload(slave, file_dev, file_master)