analog_out.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. from io_module import IO_Module
  2. from modbus import Modbus
  3. from log_reader import AnalogInputLogReader
  4. import colorama
  5. from colorama import Fore
  6. from time import sleep
  7. from serial import Serial
  8. from mb_registers import AoReg
  9. class IO_AnalogOutput(IO_Module):
  10. def __init__(self, modbus: Modbus):
  11. self.modbus = modbus
  12. super().__init__(self.modbus)
  13. '''Чтение параметров'''
  14. # Значения состояний выходов вкл./выкл. (битовое поле)
  15. def get_outputs_state(self):
  16. data = self.modbus.read_holding_registers(AoReg.OUT_STATE.value, 1)
  17. if self.DBG:
  18. print(Fore.GREEN + f'Read reg {[hex(AoReg.OUT_STATE.value)]} outputs state: {format(data[0], '04b')}')
  19. return format(data[0], '04b')
  20. # Значения состояний выходов вкл./выкл. в безопасном режиме (битовое поле)
  21. def get_outputs_state_save(self):
  22. data = self.modbus.read_holding_registers(AoReg.OUT_STATE_SAVE.value, 1)
  23. if self.DBG:
  24. print(Fore.GREEN + f'Read reg {[hex(AoReg.OUT_STATE_SAVE.value)]} outputs state (SAVE MODE): {format(data[0], '04b')}')
  25. return format(data[0], '04b')
  26. # Режим работы аналоговых выходов (0 - напряжение или 1 - ток. (битовое поле))
  27. def get_outputs_mode(self):
  28. data = self.modbus.read_holding_registers(AoReg.OUT_MODE.value, 1)
  29. if self.DBG:
  30. print(Fore.GREEN + f'Read reg {[hex(AoReg.OUT_MODE.value)]} outputs mode: {format(data[0], '04b')}')
  31. return format(data[0], '04b')
  32. # Режим работы аналоговых выходов (0 - напряжение или 1 - ток. (битовое поле))
  33. def get_outputs_mode_save(self):
  34. data = self.modbus.read_holding_registers(AoReg.OUT_MODE_SAVE.value, 1)
  35. if self.DBG:
  36. print(Fore.GREEN + f'Read reg {[hex(AoReg.OUT_MODE_SAVE.value)]} outputs mode (SAVE MODE): {format(data[0], '04b')}')
  37. return format(data[0], '04b')
  38. # Питание выходных каналов
  39. def get_outputs_power(self):
  40. data = self.modbus.read_holding_registers(AoReg.OUT_POWER.value, 1)
  41. if self.DBG:
  42. print(Fore.GREEN + f'Read reg {[hex(AoReg.OUT_POWER.value)]} outputs power: {format(data[0], '04b')}')
  43. return format(data[0], '04b')
  44. '''Установка параметров'''
  45. # Значения состояний выходов вкл./выкл. (битовое поле)
  46. def set_outputs_state(self, val):
  47. if self.DBG:
  48. print(Fore.BLUE + f'Write reg {[hex(AoReg.OUT_STATE.value)]} outputs state: {format(val, '04b')}')
  49. self.modbus.write_holding_register(AoReg.OUT_STATE.value, val)
  50. # Значения состояний выходов вкл./выкл. в безопасном режиме (битовое поле)
  51. def set_outputs_state_save(self, val):
  52. if self.DBG:
  53. print(Fore.BLUE + f'Write reg {[hex(AoReg.OUT_STATE_SAVE.value)]} outputs state (SAVE MODE): {format(val, '04b')}')
  54. self.modbus.write_holding_register(AoReg.OUT_STATE_SAVE.value, val)
  55. # Значения состояний выходов вкл./выкл. (битовое поле)
  56. def set_outputs_mode(self, val):
  57. if self.DBG:
  58. print(Fore.BLUE + f'Write reg {[hex(AoReg.OUT_MODE.value)]} outputs mode: {format(val, '04b')}')
  59. self.modbus.write_holding_register(AoReg.OUT_MODE.value, val)
  60. # Значения состояний выходов вкл./выкл. в безопасном режиме (битовое поле)
  61. def set_outputs_mode_save(self, val):
  62. if self.DBG:
  63. print(Fore.BLUE + f'Write reg {[hex(AoReg.OUT_MODE_SAVE.value)]} outputs mode (SAVE MODE): {format(val, '04b')}')
  64. self.modbus.write_holding_register(AoReg.OUT_MODE_SAVE.value, val)
  65. # Установка значения вы выходе (относительные единицы)
  66. def set_ouputs_value(self, channel, val):
  67. if self.DBG:
  68. print(Fore.BLUE + f'Write reg {[hex(AoReg.OUT_VALUE.value + channel - 1)]} output {channel} value: {val}')
  69. self.modbus.write_holding_register(AoReg.OUT_VALUE.value + channel - 1, val)
  70. # Установка значения вы выходе в безопасном режиме (относительные единицы)
  71. def set_ouputs_value_save(self, channel, val):
  72. if self.DBG:
  73. print(Fore.BLUE + f'Write reg {[hex(AoReg.OUT_VALUE_SAVE.value + channel - 1)]} output {channel} value: {val}')
  74. self.modbus.write_holding_register(AoReg.OUT_VALUE_SAVE.value + channel - 1, val)
  75. def main():
  76. colorama.init(autoreset=True)
  77. serial_port = Serial('COM22', 115200, timeout=0.05, parity='N', xonxoff=False)
  78. ao_modbus = Modbus(serial_port, 8)
  79. ao = IO_AnalogOutput(ao_modbus)
  80. ao.DBG = True
  81. '''Тесты отдельного модуля аналоговых выходов'''
  82. # ao.sys.get_system_vars()
  83. '''Настройка аналоговых выходов'''
  84. # ao.set_outputs_state(0b1111)
  85. # ao.set_outputs_state_save(0b1111)
  86. # ao.set_outputs_mode(0b0000)
  87. # ao.set_outputs_mode_save(0b0000)
  88. '''Чтение режимов работы аналоговых выходов'''
  89. # ao.get_outputs_state()
  90. # ao.get_outputs_state_save()
  91. # ao.get_outputs_mode()
  92. # ao.get_outputs_mode_save()
  93. # ao.get_outputs_power()
  94. '''Установка значений на выходах'''
  95. # values = [50000, 50000, 50000, 50000]
  96. # ao.set_ouputs_value(1, values[0])
  97. # ao.set_ouputs_value(2, values[1])
  98. # ao.set_ouputs_value(3, values[2])
  99. # ao.set_ouputs_value(4, values[3])
  100. '''
  101. while True:
  102. ao.set_ouputs_value(4, values[0])
  103. values[0] += 100
  104. if values[0] >= 50000:
  105. values[0] = 0
  106. sleep(0.1)
  107. '''
  108. '''
  109. ao.set_ouputs_value(1, 12)
  110. ao.set_ouputs_value(2, 13)
  111. ao.set_ouputs_value(3, 14)
  112. ao.set_ouputs_value(4, 15)
  113. ao.set_ouputs_value_save(1, 17)
  114. ao.set_ouputs_value_save(2, 18)
  115. ao.set_ouputs_value_save(3, 19)
  116. ao.set_ouputs_value_save(4, 20)
  117. '''
  118. '''Сохранение настроек'''
  119. # ao.sys.save_sattings()
  120. '''Обновление прошивки'''
  121. ao_modbus.MB_DEBUG = True
  122. ao.updater.update('fw.bin', 'MAO_4')
  123. if __name__ == '__main__':
  124. main()