from device_conf import class_comm_device_config import comm_remap as remap import menu_page from comm_device import class_comm_device from comm_thread import class_comm_master_thread from menu_base import class_device_menu import menu_utils as utils import comm_global from enum import Enum import math from comm_modbus_device import class_modbus_comm_device from comm_protocol_modbus import class_protocol_modbus from enum import Enum class Alarm(Enum) : NO_ERR = 0, #无故阿 ERR_CREEPAGE_LOCK = 1, #漏电报警 ERR_VOLTAGE_LOW = 2, #欠压报警 ERR_OVER_CURRENT = 3, #过流保护 ERR_SHORT_CURRENT = 4, #短路保护 ERR_CREEPAGE_SELECT = 5, #选择性报? ERR_UNBANLANCE_CURRENT = 6, #三相不平衡报? ERR_FLASH_FAIL = 7, #FLASH无法写入 ERR_CREEPAGE_ACTIVE = 8, #漏电动作 ERR_BREAK_PHASE = 9, #断相保护动作 ERR_VOLTAGE_BREAK_PHASE = 10, #电压断相 ERR_GAS_LOCK = 11, #瓦斯闭锁 ERR_WIND_MOTOR_LOCK = 12, #风电闭锁 ERR_VOLTAGE_OVER = 13, #过压报警 ERR_SHORT_PHASE = 14, #相敏短路 ERR_WATCH_DOG = 15, #看门狗保房 ERR_SWITCH_FAIL = 16, #开关粘轿 ERR_SWITCH_THROUGH = 17, #开关击? ERR_SWITCH_ON_FAIL = 18, #开关合闸失? ERR_COMM_FAIL = 19, #通讯故障 ERR_CREEPAGE_SELECT2 = 20, #选择性报? ERR_TEMP_IO_HIGH = 21, #IO口温度过驿 ERR_SHORT_CURRENT_SIGNAL = 22, #信号电流短路 ERR_REMOTE_OFF = 23, #远方分励 ERR_REPAIR = 24, #维修状? ERR_TEMP_ALARM = 25, #温度报警 ERR_QUICK_CREEPAGE_ACT = 26, #快速漏电动仿 ERR_GB_LEEK_SHORT = 27, #高爆绝缘短路 ERR_GB_LEEK_BREAK = 28, #高爆绝缘断路 ERR_YB_LOW_VOLTAGE_FAIL = 29, #移变低压侧失? ERR_YB_LOW_VOLTAGE_UNREADY = 30, #移变低压侧未准备? ERR_WS_FREQ_FAIL = 31, #瓦斯浓度超标 ERR_HIGH_LOW_LOCK = 32, #高低压联钿 ERR_MOTOR_ROTATE_LOCK = 33, #电机堵转 ERR_FIX_TIME_OVER_CURRENT = 34, #定时限过泿 ERR_FIX_TIME_SHORT_CURRENT = 35, #定时限短? ERR_PHASE_ERROR = 36, #相序故障 ERR_UNDER_LOAD = 37, #欠载保护 ERR_PHASE_UNMATCH = 38, #互感器反? ERR_EXTERNAL_ALARM = 39, #外部故障 ERR_SENSOR_LOSS = 40, #水位传感器未? ERR_ROTOR_SLOW = 41, ERR_ROTOR_LOCK = 42, ERR_POWER_LOSS = 43, #系统断电 ERR_RSV1 = 44, ERR_RSV2 = 45, ERR_RSV3 = 46, ERR_RSV4 = 47, ERR_RSV5 = 48, ERR_RSV6 = 49, ERR_RSV7 = 50, ERR_USER_ALARM1 = 51, #=50, 用户自定义故阿 ERR_USER_ALARM2 = 52, #=51,用户自定义故阿 ERR_USER_ALARM3 = 53,#=52,用户自定义故阿 ERR_USER_ALARM4 = 54, #=53,用户自定义故阿 ERR_GB_LIGHT_THREAD_SON_LOSS = 55, ERR_GB_LIGHT_THREAD_BROTHER_LOSS = 56, ERR_GB_LIGHT_MODULE_LOSS = 57, ERR_GB_FORCE_LEEK_OFF = 58, ERR_GB_FORCE_SHORT_OFF = 58, ERR_GB_CREEPAGE_SELECT = 59, #选择性报警 ERR_SWITCH_OUT_POSITION = 60, ERR_DZM_CREEPAGE_ACTIVE = 61, ERR_OIL_PRESSURE_SENSOR_FAIL = 62, ERR_FREQ_SENSOR_EXCEED = 63, ERR_FREQ_SENSOR_FAIL = 64, ERR_ANALOG_SENSOR_EXCEED = 65, ERR_ANALOG_SENSOR_FAIL = 66, ERR_VOLTAGE_LOSS = 67, ERR_SPEED_LOSS = 68, ERR_GB_ZERO_VOLT_OVER = 69, #零序过压 ERR_PT_BREAK = 70, ERR_CT_BREAK = 71, ERR_ZERO_OVER_VOLTAGE = 72, ERR_ZERO_OVER_CURRENT = 73, ERR_GAS_WARNING = 74, ERR_TEMP_WARNING = 75, ERR_COMM_LOSS = 76, ERR_CAR_FAIL = 77, ERR_WATER_LOW = 78, ERR_SWITCH_DIDAO_IN_POSITION = 79, ERR_SWITCH_DIDAO_MID_POSITION =80, ERR_GB_CREEPAGE_SELECT_5 = 81, #5次谐波选漏 ERR_FLUX_LOCK = 82, ERR_GLOBAL_OIL_TEMP_LOCK = 83, ERR_GLOBAL_WATER_PRESSURE_LOCK = 84, ERR_GLOBAL_WATER_LEVEL_LOCK = 85, ERR_GLOBAL_CURRENT_SENSOR_LOSS = 86, ERR_GLOBAL_GAS_PERCENTAGE_LOCK = 87, ERR_GLOBAL_GAS_SENSOR_LOSS = 88, ERR_MEASURE_OVER_CURRENT = 89, #测量回路过流保护 ERR_CREAPGE_BREAK = 90, ERR_REMOTE_CREAPGE_TEST_FAIL = 91, ERR_REMOTE_CREAPGE_TEST_SUCCESS = 92, ERR_ISOLATE_ALARM = 93, ERR_DIDAO_FAIL = 94, ERR_EARTH_NOT_READY = 95, ERR_ISOLATE_NOT_READY = 96, alias_table = [ {"alias_bool": {0:"关闭", 1:"打开"}}, {"alias_voltage": {0:"3300V", 1:"6000V", 2:"10000V"}}, {"alias_parity": {0: "无校验", 1: "奇校验", 2: "偶校验"}}, {"alias_baud": {0: "1200", 1: "2400", 2: "4800", 3: "9600", 4:"19200", 5:"38400", 6:"51200", 7:"115200"}}, {"alias_input": {0: "常开", 1: "常闭"}}, {"alias_onoff": {0: "分闸", 1: "合闸"}}, {"alias_alarm": {0: "无故障", 1: "定时限短路", 2 : "定时限过流1段", 3: "定时限过流2段"}}, {"alias_test": {0: "测试", 1: "动作"}}, ] mqtt_pack_alarm = [ { "name": "AlarmType", "addr": "8138", "alias": "alias_test" }, ] mqtt_pack_measure = [ { "name": "OnStatus", "addr": "8162.0", "alias": "alias_onoff", "remap_addr": remap.COMM_REMAP_MEASURE_SWITCH_STATUS, "scale": 1.0, "format": "%1.0f", "mqtt" : "OnStatus", }, { "name": "AlarmStatus", "addr": "8166", "alias": "alias_alarm", "remap_addr": remap.COMM_REMAP_MEASURE_SWITCH_ALARM, "scale": 1.0, "format": "%1.0f", "mqtt" : "AlarmStatus", }, { "name": "Ia", "unit": "A", "addr": "8156", "format": "%1.0f", "remap_addr": remap.COMM_REMAP_MEASURE_FLOAT_IA, "mqtt" : "Ia", }, { "name": "Ib", "unit": "A", "addr": "8157", "format": "%1.0f", "remap_addr": remap.COMM_REMAP_MEASURE_FLOAT_IB, "mqtt" : "Ib", }, { "name": "Ic", "unit": "A", "addr": "8158", "format": "%1.0f", "remap_addr": remap.COMM_REMAP_MEASURE_FLOAT_IC, "mqtt" : "Ic", }, { "name": "Uab", "unit": "V", "addr": "8153", "format": "%1.0f", "remap_addr": remap.COMM_REMAP_MEASURE_FLOAT_UAB, "mqtt" : "Uab", }, { "name": "Ubc", "unit": "V", "addr": "8154", "format": "%1.0f", "remap_addr": remap.COMM_REMAP_MEASURE_FLOAT_UBC, "mqtt" : "Ubc", }, { "name": "Uca", "unit": "V", "addr": "8155", "format": "%1.0f", "remap_addr": remap.COMM_REMAP_MEASURE_FLOAT_UCA, "mqtt" : "Uca", }, { "name": "Uo", "unit": "V", "addr": "8152", "format": "%1.0f", "remap_addr": remap.COMM_REMAP_MEASURE_FLOAT_UO, "mqtt" : "Uo", }, { "name": "Io", "unit": "mA", "addr": "8151", "format": "%1.0f", "scale" : 1.0, "remap_addr" : remap.COMM_REMAP_MEASURE_FLOAT_IO, "mqtt" : "Io", }, { "name": "Ro", "unit": "K", "addr": "8150", "scale": 0.1, "format": "%2.1f", "remap_addr": remap.COMM_REMAP_MEASURE_FLOAT_RO, "mqtt" : "Ro", }, ] mqtt_pack_alarm = [ { "name": "AlarmType", "addr": "8138", "alias": "alias_test" }, ] modbus_comm_table = [ {"name":"status", "comm_str" : "8162#4", "reg_addr":8162, "reg_count":4, "cycle": 100}, {"name":"alarm", "comm_str" : "8120#10", "reg_addr":8120, "reg_count":10, "cycle": 0, "mqtt_pack": mqtt_pack_alarm}, {"name":"measure", "comm_str" : "8139#35", "reg_addr":8139, "reg_count":35, "cycle": 200, "mqtt_pack": mqtt_pack_measure}, {"name":"comm_cmd", "comm_str" : "100618#32", "reg_addr":100618, "reg_count":32, "cycle": 0}, #{"name":"key_group", "comm_str" : "8162#4", "reg_addr":1000, "reg_count":8, "cycle": 20}, {"name":"para_group", "comm_str" : "2000#10", "reg_addr":2000, "reg_count":10, "cycle": 0}, {"name":"time_group", "comm_str" : "2300#6", "reg_addr":2300, "reg_count":6, "cycle": 500}, {"name":"protect_group", "comm_str" : "8174#46", "reg_addr":8174, "reg_count":46, "cycle": 0}, #{"name":"ip_addr_group", "comm_str" : "8410#6", "reg_addr":8410, "reg_count":6, "cycle": 0}, #{"name":"ip_group", "comm_str" : "8271#8", "reg_addr":8271, "reg_count":8, "cycle": 0}, {"name":"inter_group", "comm_str" : "8240#10", "reg_addr":8240, "reg_count":10, "cycle": 0}, ] def func_comm_table_trigger_check(object_comm_table, comm_table_item) : if not hasattr(comm_table_item, "name"): return False #添加on_status 与 prev_on_status, 用于判断合闸状态是否发送变化 if not hasattr(object_comm_table, 'prev_on_status'): object_comm_table.prev_on_status = False if not hasattr(object_comm_table, 'prev_alarm_id'): object_comm_table.prev_alarm_id = 0 onstatus = object_comm_table.read_register_u16(8162) if onstatus == None : return False onstatus = onstatus & 0x1 alarm_id = object_comm_table.read_register_u16(8166) if alarm_id == None : return False prev_on_status = object_comm_table.prev_on_status prev_alarm_id = object_comm_table.prev_alarm_id if prev_on_status != onstatus : #合分闸状态发生改变, 触发"measure"通讯组 if comm_table_item.name == "measure" : object_comm_table.prev_on_status =onstatus return True if prev_alarm_id != alarm_id : #故障状态发生改变, 触发"alarm"通讯组 if comm_table_item.name == "alarm" : object_comm_table.prev_alarm_id = alarm_id return True return False menu_current = [ #菜单表[menu_current],存储菜单项属性字典<> { "name": "额定电流", "unit": "A", "addr": "2000", "scale" : 0.1, "format": "%05.1f", "min" : 1.0, "max" : 400.0, "mqtt" : "Ie", "remap_addr": remap.COMM_REMAP_PARA_CURRENT_RATE, }, { "name": "短路倍数", "unit": "倍", "scale" : 0.01, "format": "%05.2f", "addr": "2001", "mqtt" : "ShortIe", "remap_addr": remap.COMM_REMAP_PARA_CURRENT_SHORT_MUL, }, { "name": "退出", "action": "exit", }, ] CONVERT_FROM_ORIGIN_VALUE_TO_REMAP_VALUE = 0 CONVERT_FROM_REMAP_VALUE_TO_ORIGIN_VALUE = 0 def func_rate_voltage_convert(value, type) : if type == CONVERT_FROM_ORIGIN_VALUE_TO_REMAP_VALUE : if value == 0 : result = 380 elif value == 1 : result = 660 else : result = 1140 else : if value == 380 : result = 0 elif value == 660 : result = 1 else : result = 2 return result menu_voltage = [ { "name": "额定电压", "addr": "8211", "alias": "alias_voltage", "mqtt" : "Ue", "remap_addr": remap.COMM_REMAP_PARA_RATE_VOLTAGE, "convert": func_rate_voltage_convert, }, { "name": "欠压比值", "unit": "Ue", "addr": "2004", "scale" : 0.001, "format": "%05.3f", "mqtt" : "UnderVoltageRatio", "remap_addr": remap.COMM_REMAP_PARA_LOW_VOLTAGE_RATIO, }, { "name": "欠压延时", "unit": "s", "addr": "2005", "scale" : 0.1, "format": "%05.1f", "mqtt" : "UnderVoltageDelay", "remap_addr": remap.COMM_REMAP_PARA_LOW_VOLTAGE_DELAY, }, { "name": "退出", "action": "exit", }, ] menu_alarm = [ { "name": "故障查询", "action": "alarm_query", }, { "name": "故障清除", "action": "alarm_clear", }, { "name": "退出", "action": "exit", }, ] # 缺省action处理函数 def func_action_process(device : class_modbus_comm_device, menu_item = None) : action_str = utils.dict_or_object_get_attr(menu_item, "action", " ") mqtt_name = utils.dict_or_object_get_attr(menu_item, "mqtt", " ") if action_str == "write_bit" : comm_str = utils.dict_or_object_get_attr(menu_item, "addr", " ") reg_addr, bit, reg_count = utils.comm_str_unpack(comm_str) if reg_count == 1: command_value = [1] result = device.write_bit_register(reg_addr, command_value) if device.mqtt_thread : device.mqtt_thread.publish("response/action/" + device.unique_name, '{"name" : "%s", "result" : %d}'%(mqtt_name, result)) menu_switch_cmd = [ { "name": "通讯合闸", "action": "write_bit", "addr" : "100618", "mqtt" : "SwitchOn", }, { "name": "通讯分闸", "action": "write_bit", "addr" : "100619", "mqtt" : "SwitchOff", }, { "name": "通讯复位", "action": "write_bit", "addr" : "100620", "mqtt" : "SwitchRst", }, ] menu_test = [ { "name": "短路试验", "action": "write_bit", "addr" : "100628", "mqtt" : "TestShort", }, { "name": "漏电试验", "action": "write_bit", "addr" : "100629", "mqtt" : "TestIsolation", }, { "name": "退出", "action": "exit", }, ] menu_protect_set = [ { "name": "短路保护", "alias": "alias_bool", "addr": "8192.1", }, { "name": "不平衡保护", "alias": "alias_bool", "addr": "8192.2", }, { "name": "反时限过流", "alias": "alias_bool", "addr": "8192.3", }, { "name": "过压保护", "alias": "alias_bool", "addr": "8174.0", }, { "name": "欠压保护", "alias": "alias_bool", "addr": "8174.1", }, { "name": "瓦斯闭锁", "alias": "alias_bool", "addr": "8174.13", }, { "name": "电压断相", "alias": "alias_bool", "addr": "8174.2", }, { "name": "相序保护", "alias": "alias_bool", "addr": "8174.3", }, { "name": "漏电动作", "alias": "alias_bool", "addr": "8174.6", }, { "name": "选漏保护", "alias": "alias_bool", "addr": "8174.7", }, { "name": "风电闭锁", "alias": "alias_bool", "addr": "8175.0", }, { "name": "退出", "action": "exit", }, ] menu_comm_set = [ { "name": "485波特率", "alias": "alias_baud", "addr": "8188", }, { "name": "485校验", "alias": "alias_parity", "addr": "8194", }, { "name": "IP设置", "addr": "8410#2", "action": "ip", }, { "name": "IP网关", "addr": "8412#2", "action": "ip", }, { "name": "IP掩码", "addr": "8414#2", "action": "ip", }, { "name": "退出", "action": "exit", }, ] menu_system = [ { "name": "瓦斯触点", "alias": "alias_input", "addr": "8190", }, { "name": "风电触点", "alias": "alias_input", "addr": "8248", }, { "name": "系统日期", "addr": "2300#3", "action": "date", }, { "name": "当前时间", "addr": "2303#3", "action": "time", }, { "name": "退出", "action": "exit", }, ] Menu_Top = [ { "name": "电流设置", "sub_menu": "menu_current", }, { "name": "电压设置", "sub_menu": "menu_voltage" }, { "name": "系统设置", "sub_menu": "menu_system" }, { "name": "保护设置", "sub_menu": "menu_protect_set" }, { "name": "通讯设置", "sub_menu": "menu_comm_set" }, { "name": "故障查询", "sub_menu": "menu_alarm" }, { "name": "保护试验", "sub_menu": "menu_test" }, { "name": "退出", "action": "exit", }, ] menu_caption = [ {"name" : "Menu_Top", "menu" : Menu_Top, "next" : Menu_Top, "prev" : Menu_Top, "caption": "主菜单", "page" : menu_page.KUNLUN_GRAOUP_PAGE_MENU, "max_items" : 8}, {"name" : "menu_current", "menu" : menu_current, "next" : menu_current, "prev" : menu_current, "caption": "电流设置", "page" : menu_page.KUNLUN_GRAOUP_PAGE_MENU, "max_items" : 8}, {"name" : "menu_voltage", "menu" : menu_voltage, "next" : menu_voltage, "prev" : menu_voltage, "caption": "电压设置", "page" : menu_page.KUNLUN_GRAOUP_PAGE_MENU, "max_items" : 8}, {"name" : "menu_system", "menu" : menu_system, "next" : menu_system, "prev" : menu_system, "caption": "系统设置", "page" : menu_page.KUNLUN_GRAOUP_PAGE_MENU, "max_items" : 8}, {"name" : "menu_protect_set", "menu" : menu_protect_set, "next" : menu_protect_set, "prev" : menu_protect_set, "caption": "保护设置", "page" : menu_page.KUNLUN_GRAOUP_PAGE_MENU, "max_items" : 8}, {"name" : "menu_comm_set", "menu" : menu_comm_set, "next" : menu_comm_set, "prev" : menu_comm_set, "caption": "通讯设置", "page" : menu_page.KUNLUN_GRAOUP_PAGE_MENU, "max_items" : 8}, {"name" : "menu_alarm", "menu" : menu_alarm, "next" : menu_alarm, "prev" : menu_alarm, "caption": "故障查询", "page" : menu_page.KUNLUN_GRAOUP_PAGE_MENU, "max_items" : 8}, {"name" : "menu_test", "menu" : menu_test, "next" : menu_test, "prev" : menu_test, "caption": "保护试验", "page" : menu_page.KUNLUN_GRAOUP_PAGE_MENU, "max_items" : 8}, {"name" : "mqtt_pack_alarm", "menu" : mqtt_pack_alarm, "next" : mqtt_pack_alarm, "prev" : mqtt_pack_alarm, "caption": "报警数据", "page" : menu_page.KUNLUN_GRAOUP_PAGE_MENU, "max_items" : 8}, {"name" : "mqtt_pack_measure", "menu" : mqtt_pack_measure, "next" : mqtt_pack_measure, "prev" : mqtt_pack_measure, "caption": "测量数据", "page" : menu_page.KUNLUN_GRAOUP_PAGE_MENU, "max_items" : 8}, {"name" : "menu_switch_cmd", "menu" : menu_switch_cmd, "next" : menu_switch_cmd, "prev" : menu_switch_cmd, "caption": "通讯命令", "page" : menu_page.KUNLUN_GRAOUP_PAGE_MENU, "max_items" : 8}, ] class class_9TE_comm_device_config(class_comm_device_config): def __init__(self): class_comm_device_config.__init__(self) pass #@override get_alias_table def get_alias_table(self) : return alias_table #@override get_comm_table def get_comm_table(self) : return modbus_comm_table, func_comm_table_trigger_check #@override get_menu_top def get_menu_top(self) : return Menu_Top #@override menu_get_display_page def menu_get_display_page(self, active_menu): return menu_page.KUNLUN_GRAOUP_PAGE_MENU def get_menu_caption_info(self) : return menu_caption def modify_menu_item(self, menu_item, value) : alias_name = utils.dict_or_object_get_attr(menu_item, "alias", None) if isinstance(alias_name, Enum) : alias_name = alias_name.name is_alias = False if alias_name != None : is_alias = True value = math.round(value) #别名值需要为整数 return False #comm_device_config的名字不要更改, 创建通讯配置类 comm_device_config = class_9TE_comm_device_config()