|
@@ -5,7 +5,8 @@ import time
|
|
|
import os
|
|
|
|
|
|
reg_table = {'in_bits': 0x0100, 'in_cnt': 0x0102, 'in_mode': 0x0120, 'in_norm': 0x0122, 'in_deb_start': 0x124,
|
|
|
- 'out_cur': 0x0200, 'out_mode': 0x0202,
|
|
|
+ 'out_cur': 0x0200, 'out_mode': 0x0202, 'out_mode_save': 0x0203, 'pwm_duty': 0x0210,
|
|
|
+ 'pwm_duty_save': 0x0220, 'pwm_per': 0x0230, 'pwm_per_save': 0x0240,
|
|
|
'rtc_unix': 0x0802, 'rtc_sinhro': 0x0804, 'uptime': 0x0800,}
|
|
|
|
|
|
|
|
@@ -116,6 +117,9 @@ class IO_Module(Modbus):
|
|
|
data = self.read_holding_registers(reg_table['in_deb_start'] + input - 1, 1)
|
|
|
return data[0]
|
|
|
|
|
|
+ def get_debounce_channels(self):
|
|
|
+ return self.read_holding_registers(reg_table['in_deb_start'], 8)
|
|
|
+
|
|
|
def set_debounce_channel(self, input, val):
|
|
|
self.write_holding_register(reg_table['in_deb_start'] + input - 1, val)
|
|
|
|
|
@@ -152,6 +156,45 @@ class IO_Module(Modbus):
|
|
|
data = ret[0] & ~(0b1 << (output - 1))
|
|
|
self.set_outputs_mode(data)
|
|
|
|
|
|
+ # 0x0203 - состояние выходов (режим обычного выхода) в безопасном режиме работы
|
|
|
+ def get_outputs_mode_save(self):
|
|
|
+ data = self.read_holding_registers(reg_table['out_mode_save'], 1)
|
|
|
+ return format(data[0], '08b')
|
|
|
+
|
|
|
+ def set_outputs_mode_save(self, val):
|
|
|
+ self.write_holding_register(reg_table['out_mode_save'], val)
|
|
|
+
|
|
|
+ def set_output_mode_save(self, output, val):
|
|
|
+ ret = self.read_holding_registers(reg_table['out_mode_save'], 1)
|
|
|
+ if val == 1:
|
|
|
+ data = ret[0] | (0b1 << (output - 1))
|
|
|
+ else:
|
|
|
+ data = ret[0] & ~(0b1 << (output - 1))
|
|
|
+ self.set_outputs_mode_save(data)
|
|
|
+
|
|
|
+ # 0x0210 - заполнение PWM (%)
|
|
|
+ def get_pwm_duty(self, output):
|
|
|
+ data = self.read_holding_registers(reg_table['pwm_duty'] + output - 1, 1)
|
|
|
+ return data[0]
|
|
|
+
|
|
|
+ def get_pwm_duty_all(self):
|
|
|
+ return self.read_holding_registers(reg_table['pwm_duty'], 8)
|
|
|
+
|
|
|
+ def set_pwm_duty(self, output, val):
|
|
|
+ self.write_holding_register(reg_table['pwm_duty'] + output - 1, val)
|
|
|
+
|
|
|
+ # 0x0220 - заполнение PWM (%)
|
|
|
+ def get_pwm_duty_all_save(self):
|
|
|
+ return self.read_holding_registers(reg_table['pwm_duty_save'], 8)
|
|
|
+
|
|
|
+ # 0x0230 - период PWM (0.1 сек)
|
|
|
+ def get_pwm_period_all(self):
|
|
|
+ return self.read_holding_registers(reg_table['pwm_per'], 8)
|
|
|
+
|
|
|
+ # 0x0240 - период PWM в безопасном режиме (0.1 сек)
|
|
|
+ def get_pwm_period_all_save(self):
|
|
|
+ return self.read_holding_registers(reg_table['pwm_per_save'], 8)
|
|
|
+
|
|
|
def get_uptime(self):
|
|
|
return self.read_uint32_holding(reg_table['uptime'])
|
|
|
|
|
@@ -167,6 +210,8 @@ def main():
|
|
|
colorama.init(autoreset=True)
|
|
|
dev = IO_Module('COM24', 115200, 14)
|
|
|
dev.MB_DEBUG = False
|
|
|
+
|
|
|
+ trigger = 0
|
|
|
# dev.update('fw.bin')
|
|
|
|
|
|
# Запрос системных параметров, установка времени
|
|
@@ -190,23 +235,36 @@ def main():
|
|
|
dev.set_debounce_channel(i, 50 + i)
|
|
|
dev.set_output(i, 0)
|
|
|
|
|
|
+ # 0x0203 - состояние выходов (режим обычного выхода) в безопасном режиме работы
|
|
|
+ for i in range(1, 9):
|
|
|
+ dev.set_output_mode_save(i, 0)
|
|
|
+
|
|
|
+ # 0x0210 - заполнение PWM (ms)
|
|
|
+ for i in range(1, 9):
|
|
|
+ dev.set_pwm_duty(i, 10 + i)
|
|
|
+
|
|
|
# Установить 1-ый выход в режим PWM
|
|
|
- dev.set_output_mode(1, 1)
|
|
|
+ # dev.set_output_mode(1, 0)
|
|
|
|
|
|
# Установить нормальное состояние входов
|
|
|
# dev.set_inputs_norm_state(0b00110101)
|
|
|
|
|
|
+ # print(dev.get_pwm_duty_all())
|
|
|
+
|
|
|
while True:
|
|
|
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
|
|
|
# Значения входов (битовое поле)
|
|
|
print('Inputs values [bit field] :', Fore.GREEN + dev.get_inputs_bit())
|
|
|
+
|
|
|
# Режим работы входов (битовое поле)
|
|
|
print('Inputs mode [bit field] :', Fore.GREEN + dev.get_inputs_mode())
|
|
|
+
|
|
|
# Нормальное состояние входов (битовое поле)
|
|
|
print('Inputs norm [bit field] :', Fore.GREEN + dev.get_inputs_norm_state())
|
|
|
+
|
|
|
# Период антидребезга (ms)
|
|
|
- for i in range(1, 9):
|
|
|
- print(f'Debounce input {i} (ms) :', Fore.GREEN + str(dev.get_debounce_channel(i)))
|
|
|
+ print('Debounce input (ms) :', Fore.GREEN + ' | '.join(str(el) for el in dev.get_debounce_channels()))
|
|
|
+
|
|
|
# Значение счетчиков
|
|
|
data = dev.get_inputs_counters()
|
|
|
print('Inputs counters :', Fore.GREEN + ' | '.join(str(el) for el in data))
|
|
@@ -214,7 +272,27 @@ def main():
|
|
|
# Текущее состояние выходов в обычном режиме
|
|
|
print('Outputs norm [bit field] :', Fore.GREEN + dev.get_outputs())
|
|
|
|
|
|
+ # Состояние выходов в безопасном режиме
|
|
|
+ print('Outputs save [bit field] :', Fore.GREEN + dev.get_outputs_mode_save())
|
|
|
+
|
|
|
+ # Режим работы выходов
|
|
|
+ print('Outputs mode [bit field] :', Fore.GREEN + dev.get_outputs_mode())
|
|
|
+
|
|
|
+ # 0x0210 - заполнение PWM (ms)
|
|
|
+ print('PWM duty cycle [%] :', Fore.GREEN + ' | '.join(str(el) for el in dev.get_pwm_duty_all()))
|
|
|
+
|
|
|
+ # 0x0220 - заполнение PWM в безопасном режиме (ms)
|
|
|
+ print('PWM duty cycle (save) [%] :', Fore.GREEN + ' | '.join(str(el) for el in dev.get_pwm_duty_all_save()))
|
|
|
+
|
|
|
+ # 0x0230 - период PWM (0.1 сек)
|
|
|
+ print('PWM period [0.1 sec] :', Fore.GREEN + ' | '.join(str(el) for el in dev.get_pwm_period_all()))
|
|
|
|
|
|
+ # 0x0240 - период PWM в безопасном режиме (0.1 сек)
|
|
|
+ print('PWM period save [0.1 sec] :', Fore.GREEN + ' | '.join(str(el) for el in dev.get_pwm_period_all_save()))
|
|
|
+
|
|
|
+ # Дергаем одним выходом
|
|
|
+ # dev.set_output(2, trigger)
|
|
|
+ # trigger = not trigger
|
|
|
|
|
|
# # Для проверки выходов в обычном режиме
|
|
|
# for i in range(1, 9):
|