Commu_IEC103_Interface.c
上传用户:yuadon
上传日期:2022-05-24
资源大小:7k
文件大小:27k
开发平台:

C/C++

  1. ///////////////////////////////////////////////////////////////
  2. // 2009-11-26 19:00
  3. // 与张洁的接口
  4. //
  5. ///////////////////////////////////////////////////////////////
  6. #include "Commu_IEC103_Interface.h"
  7. TCONTROL_INFO yk_ctrlinfo;
  8. uint16 Global_YC_Num;
  9. /*
  10. IRQ_AD_Simult
  11. //收发数据
  12. comm_RecSendProcess();
  13. //报文解析,组包
  14. comm_Proc_InMainCycle();
  15. //收发数据
  16. comm_RecSendProcess();
  17. Comm[i].RecSendProcess(&Comm[i].MsgBuff.BuffBase);
  18. COMM_PORT_NET1: 485: NET485A_Process
  19. COMM_PORT_NET2: 485: NET485B_Process
  20. COMM_PORT_NET1: CAN: NETCANA_Process
  21. COMM_PORT_NET2: CAN: NETCANB_Process
  22. NET485A_Process:
  23. NetAPort_OnRecieve(Rxbuf, rxffst);
  24. NetAPort_OnSend();
  25. hd_NetA1Error_Proc();
  26. ---------------------------------
  27. comm_Proc_InMainCycle(); //报文解析,组包
  28. 1 //计数器改至主循环处理  zhang
  29. void COM_ProcessInMain(void)
  30. 2 //新报文及通讯超时处理
  31. 3 Comm[i].ProcInMainCycle(&Comm[i].MsgBuff.BuffBase);
  32. //ProcInMainCycle = DBJ_ProcInMainCycle
  33.   = MODBUS_ProcInMainCycle
  34.   = IEC103_ProcInMainCycle
  35.   
  36. */
  37. /*************************IEC103 遥测组,遥脉组,保护测量组定义************************/
  38. //const IEC103_Measure_Group IEC103_ProtMeas_Index[ ] = {
  39. //IEC103对所有保护测量量的初始化配置
  40. const IEC103_Measure_Group IEC103_ProtMeas_Index[ ] = {
  41. { MEAS_PROT_Ia,     IEC103_DATATYPE_INT16,  0    }, //Ia
  42. { MEAS_PROT_Ib,     IEC103_DATATYPE_INT16,  0    }, //Ib
  43. { MEAS_PROT_Ic,     IEC103_DATATYPE_INT16,  0    }, //Ic
  44. { MEAS_PROT_I0,     IEC103_DATATYPE_INT16,  0    }, //I0
  45. { MEAS_MEAS_Ia,     IEC103_DATATYPE_INT16,  0    }, //Ia
  46. { MEAS_MEAS_Ib,     IEC103_DATATYPE_INT16,  0    }, //Ib
  47. { MEAS_MEAS_Ic,     IEC103_DATATYPE_INT16,  0    }, //Ic
  48. { MEAS_MEAS_Ua,     IEC103_DATATYPE_INT16,  0    }, //Ua
  49. { MEAS_MEAS_Ub,     IEC103_DATATYPE_INT16,  0    }, //Ub
  50. { MEAS_MEAS_Uc,     IEC103_DATATYPE_INT16,  0    }, //Uc
  51. { MEAS_MEAS_Uab, IEC103_DATATYPE_INT16,  0    }, //Uab
  52. { MEAS_MEAS_Ubc, IEC103_DATATYPE_INT16,  0    }, //Ubc
  53. { MEAS_MEAS_Uca, IEC103_DATATYPE_INT16,  0    }, //Uca
  54. { MEAS_MEAS_P_L, IEC103_DATATYPE_INT32,  1000  },
  55. // { MEAS_MEAS_P_H, IEC103_DATATYPE_INT32,  1000  },
  56. { MEAS_MEAS_Q_L, IEC103_DATATYPE_INT32,  1000  },
  57. // { MEAS_MEAS_Q_H, IEC103_DATATYPE_INT32,  1000  },
  58. { MEAS_MEAS_S_L, IEC103_DATATYPE_INT32,  1000  },
  59. // { MEAS_MEAS_S_H, IEC103_DATATYPE_INT32,  1000  },
  60. { MEAS_MEAS_FACT, IEC103_DATATYPE_INT16,  0     }, //测量量功率因素
  61. { MEAS_MEAS_Pa_L, IEC103_DATATYPE_INT32,  1000  }, //测量量有功
  62. // { MEAS_MEAS_Pa_H, IEC103_DATATYPE_INT32,  1000  },
  63. { MEAS_MEAS_Qa_L, IEC103_DATATYPE_INT32,  1000  }, //测量量无功
  64. // { MEAS_MEAS_Qa_H, IEC103_DATATYPE_INT32,  1000  },
  65. { MEAS_MEAS_Sa_L, IEC103_DATATYPE_INT32,  1000  },
  66. // { MEAS_MEAS_Sa_H, IEC103_DATATYPE_INT32,  1000  },
  67. { MEAS_MEAS_FACTa,   IEC103_DATATYPE_INT16,  0     }, //测量量功率因素
  68.                    
  69. { MEAS_MEAS_Pb_L, IEC103_DATATYPE_INT32,  1000  }, //测量量有功    
  70. // { MEAS_MEAS_Pb_H, IEC103_DATATYPE_INT32,  1000  },                         
  71. { MEAS_MEAS_Qb_L, IEC103_DATATYPE_INT32,  1000  }, //测量量无功    
  72. // { MEAS_MEAS_Qb_H, IEC103_DATATYPE_INT32,  1000  },                         
  73. { MEAS_MEAS_Sb_L, IEC103_DATATYPE_INT32,  1000  },                         
  74. // { MEAS_MEAS_Sb_H, IEC103_DATATYPE_INT32,  1000  },                         
  75. { MEAS_MEAS_FACTb,   IEC103_DATATYPE_INT16,  0     }, //测量量功率因素,
  76.                     
  77. { MEAS_MEAS_Pc_L, IEC103_DATATYPE_INT32,  1000  }, //测量量有功    
  78. // { MEAS_MEAS_Pc_H, IEC103_DATATYPE_INT32,  1000  },
  79. { MEAS_MEAS_Qc_L, IEC103_DATATYPE_INT32,  1000  }, //测量量无功    
  80. // { MEAS_MEAS_Qc_H, IEC103_DATATYPE_INT32,  1000  },
  81. { MEAS_MEAS_Sc_L, IEC103_DATATYPE_INT32,  1000  },
  82. // { MEAS_MEAS_Sc_H, IEC103_DATATYPE_INT32,  1000  },
  83. { MEAS_MEAS_FACTc,   IEC103_DATATYPE_INT16,  0     }, //测量量功率因素,
  84. { MEAS_PE_L, IEC103_DATATYPE_UINT32, 1  }, //有功电能高位
  85. // { MEAS_PE_H, IEC103_DATATYPE_UINT32, 1  }, //有功电能地位
  86. { MEAS_QE_L, IEC103_DATATYPE_UINT32, 1  }, //无功电能高位
  87. // { MEAS_QE_H, IEC103_DATATYPE_UINT32, 1  }, //无功电能低位
  88. { MEAS_PEa_L, IEC103_DATATYPE_UINT32, 1  }, //有功电能高位
  89. // { MEAS_PEa_H, IEC103_DATATYPE_UINT32, 1  }, //有功电能地位
  90. { MEAS_QEa_L, IEC103_DATATYPE_UINT32, 1  }, //无功电能高位
  91. // { MEAS_QEa_H, IEC103_DATATYPE_UINT32, 1  }, //无功电能低位
  92. { MEAS_PEb_L, IEC103_DATATYPE_UINT32, 1  }, //有功电能高位
  93. // { MEAS_PEb_H, IEC103_DATATYPE_UINT32, 1  }, //有功电能地位
  94. { MEAS_QEb_L, IEC103_DATATYPE_UINT32, 1  }, //无功电能高位
  95. // { MEAS_QEb_H, IEC103_DATATYPE_UINT32, 1  }, //无功电能低位
  96. { MEAS_PEc_L, IEC103_DATATYPE_UINT32, 1  }, //有功电能高位
  97. // { MEAS_PEc_H, IEC103_DATATYPE_UINT32, 1  }, //有功电能地位
  98. { MEAS_QEc_L, IEC103_DATATYPE_UINT32, 1  }, //无功电能高位
  99. // { MEAS_QEc_H, IEC103_DATATYPE_UINT32, 1  }, //无功电能低位
  100. { MEAS_PHS_Ia,   IEC103_DATATYPE_INT16,  0  }, //Ia相角
  101. { MEAS_PHS_Ib,   IEC103_DATATYPE_INT16,  0  }, //Ib相角
  102. { MEAS_PHS_Ic,   IEC103_DATATYPE_INT16,  0  }, //Ic相角
  103. { MEAS_PHS_Ua,   IEC103_DATATYPE_INT16,  0  }, //Ua相角
  104. { MEAS_PHS_Ub,   IEC103_DATATYPE_INT16,  0  }, //Ub相角
  105. { MEAS_PHS_Uc,   IEC103_DATATYPE_INT16,  0  }, //Uc相角
  106. { MEAS_F, IEC103_DATATYPE_INT16,  0  }, //频率 f
  107. { MEAS_ELSE_LED, IEC103_DATATYPE_UINT16, 0  }, //灯
  108. { MEAS_ELSE_STATUS,   IEC103_DATATYPE_UINT16, 0  }, //状态
  109. { MEAS_SIGNAL_DI,   IEC103_DATATYPE_UINT16, 0  }, //开入遥信
  110. { MEAS_SIGNAL_DIEX,   IEC103_DATATYPE_UINT16, 0  }, //扩展遥信 - 预留
  111. { MEAS_SIGNAL_PROT,   IEC103_DATATYPE_UINT16, 0  }, //保护动作信号1
  112. { MEAS_SIGNAL_PROTEX, IEC103_DATATYPE_UINT16, 0  }, //保护动作信号2  - 预留
  113. { MEAS_SIGNAL_SELFCHK, IEC103_DATATYPE_UINT16, 0  }, //自检信号1
  114. { MEAS_SIGNAL_SELFCHKEX,IEC103_DATATYPE_UINT16, 0  }, //自检信号2 - 预留
  115. { MEAS_SIGNAL_TOTAL, IEC103_DATATYPE_UINT16, 0  }, //总信号
  116. { MEAS_SIGNAL_DO,   IEC103_DATATYPE_UINT16, 0  } //开出信号
  117. };
  118. /*
  119.   2009-12-21 14:23 从上述量中选出IEC103信息表中需要上送的测量量,
  120.   类似于MEAS_MEAS_P_L与MEAS_MEAS_P_H使用两个数据表示一个量的选取
  121.   头一个数据的编号,调用时进行合成的特殊处理。
  122. */
  123. /***遥测上送量***/
  124. uint16 IEC103_Measure_YC_Index[NUM_YC_MAXNUM] ={
  125. MEAS_MEAS_Uab,      
  126. MEAS_MEAS_Ubc,      
  127. MEAS_MEAS_Uca,      
  128. MEAS_MEAS_Ia,
  129. MEAS_MEAS_Ib,
  130. MEAS_MEAS_Ic,
  131. MEAS_MEAS_P_L,     
  132. MEAS_MEAS_Q_L,      
  133. MEAS_MEAS_FACT,     
  134. MEAS_F
  135. };
  136. /***遥脉电能定义***/
  137. const uint16 IEC103_Measure_YM_Index[]=
  138. {
  139. MEAS_PE_L,  //用有功电能低位代表有功电能
  140. MEAS_QE_L, //用无功电能低位代表无功电能
  141. MEAS_PEa_L, //用A相有功电能低位代表A相有功电能
  142. MEAS_QEa_L, //用A相无功电能低位代表A相无功电能
  143. MEAS_PEb_L, //用B相有功电能低位代表B相有功电能
  144. MEAS_QEb_L, //用B相无功电能低位代表B相无功电能
  145. MEAS_PEc_L, //用C相有功电能低位代表C相有功电能
  146. MEAS_QEc_L  //用C相无功电能低位代表C相无功电能
  147. };
  148. /*************************IEC103 遥测组,遥脉组,保护测量组定义************************/
  149. /******************** 通用分类服务组的条目 ********************/
  150. /*注意:
  151.  LpcRes.c文件占用空间太大,为减小代码空间,通用分类服务组的条目的名称在此
  152.  进行了定义,但必须与显示模块一致,因此名称应该与LpcRes.c文件中的名称定义相同。
  153. */
  154. //定值及系统设置的枚举值的所有文本字符串都必须包括在以下的结构体数组中
  155. IEC103_Enum_Text IEC103_Enum_String [ ] = {
  156. ///////////////////定值枚举文本//////////////////
  157. { ID_STRING_SETVAL_EXIT, "退出", "Exit"  },
  158. { ID_STRING_SETVAL_WARNING, "报警", "Warn"  },
  159. { ID_STRING_SETVAL_TRIP, "停车", "Stop"  },
  160. { ID_STRING_OVERLOAD_TYPE_DEF, "定时限", "Definite Time" },
  161. { ID_STRING_OVERLOAD_TYPE_IMDT, "超常反时限", "Very IDMT"  }, 
  162.   
  163. { ID_STRING_SETVAL_DEVOTE, "投入", "On" },
  164.   
  165. { ID_STRING_LOCAL, "本地", "Local" },
  166. { ID_STRING_REMOTE, "远程", "Remote" },
  167. { ID_STRING_BYDI, "根据外部开入", "By DI"     },                   
  168. { ID_STRING_CONTRLIMIT_BYPROFIBUS,"根据Profibus","By Profibus" },
  169. { ID_STRING_COMM, "通信", "Communication" },
  170. ///////////////////系统设置枚举文本//////////////////
  171. { ID_STRING_NONE, "", "" },
  172. { ID_STRING_SC_COMM_PROTOCOL_DBJ, "DBJ 2.0", "DBJ 2.0" },
  173. { ID_STRING_SC_COMM_PROTOCOL_MODBUS,"MODBUS", "MODBUS" },
  174. { ID_STRING_SC_COMM_PROTOCOL_IEC103,"IEC103", "IEC103" },
  175.   
  176. { ID_STRING_SC_COMM_BAUDRATE_4800, "485~4800",  "485 - 4800" },
  177. { ID_STRING_SC_COMM_BAUDRATE_9600, "485~9600",  "485 - 9600" },
  178. { ID_STRING_SC_COMM_BAUDRATE_19200, "485~19200", "485 - 19200" },
  179. { ID_STRING_SC_COMM_BAUDRATE_38400, "485~38400", "485 - 38400" },
  180. { ID_STRING_SC_COMM_BAUDRATE_57600, "485~57600", "485 - 57600" },
  181. { ID_STRING_SC_COMM_BAUDRATE_115200,"485~115200","485 - 115200" },
  182. // { ID_STRING_SC_COMM_BAUDRATE_10K, "CAN~10K",  "CAN - 10K" },
  183. // { ID_STRING_SC_COMM_BAUDRATE_20K, "CAN~20K",  "CAN - 20K" },
  184. { ID_STRING_SC_COMM_BAUDRATE_50K, "CAN~50K",  "CAN - 50K" },
  185. { ID_STRING_SC_COMM_BAUDRATE_80K, "CAN~80K",  "CAN - 80K" },
  186. { ID_STRING_SC_COMM_BAUDRATE_100K, "CAN~100K",  "CAN - 100K" },
  187. { ID_STRING_SC_COMM_BAUDRATE_125K, "CAN~125K",  "CAN - 125K" },
  188. { ID_STRING_SC_COMM_BAUDRATE_250K, "CAN~250K",  "CAN - 250K" },
  189. { ID_STRING_SC_COMM_BAUDRATE_500K, "CAN~500K",  "CAN - 500K" },
  190.   
  191. { ID_STRING_IA, "IA", "IA" },
  192. { ID_STRING_IB, "IB", "IB" },
  193. { ID_STRING_IC, "IC", "IC" },
  194. { ID_STRING_IAV, "IAv", "IAv" },
  195. { ID_STRING_IPUN, "IPun", "IPun" },
  196. { ID_STRING_UAB, "UAB", "UAB" },
  197. { ID_STRING_UBC, "UBC", "UBC" },
  198. { ID_STRING_UCA, "UCA", "UCA" },
  199. { ID_STRING_UAV, "Uav", "Uav" },
  200. { ID_STRING_F, "F ", "F " },
  201. { ID_STRING_P, "P ", "P " },
  202.   
  203. { ID_STRING_SC_LANGUAGE_CN, "中文", "Chinese" },
  204. { ID_STRING_SC_LANGUAGE_EN, "英文", "English" }, 
  205.   
  206. { ID_STRING_WAVE_SEND_DISNABLE, "禁止上送", "Disable" }, //禁止上送
  207. { ID_STRING_WAVE_SEND_ENABLE, "允许上送", "Enable" } //允许上送
  208. };
  209. /******************** 通用分类服务组的条目的描述 ********************/
  210. //装置描述: 为节省代码空间,可以在函数实现时再定义 “装置描述”的条目名称。
  211. Description_Resource IEC103_DESCRIPTION_KOD10[ ] = {
  212. { "装置描述"      ,  "DEVICE DESCRIPTION"  },
  213. { "制造厂家"      ,  "Manufacture"   },
  214. { "装置型号"      ,  "Device Type"   },
  215. { "软件版本"      ,  "Software Version"   },
  216. { "程序形成时间"  ,  "Software Build Time"  },
  217. { "程序加载时间"  ,  "Software Load Time"   }
  218. };
  219. //装置定值名称
  220. Description_Resource IEC103_SetPoint_KOD10[NUM_SETTINGS+1] = {
  221. { "定值"       ,  "DEVICE SETPOINT"   },
  222. { "接地保护电流整定值"   ,  "Earth Fault Curr. Setting"  },
  223. { "接地保护动作时间"     ,  "Earth Fault Time Setting"  },
  224. { "接地保护动作方式" ,  "Earth Fault Act Mode"   },
  225. { "DO1时间定义"   ,  "DO1 Pulse Width"  },
  226. { "DO2时间定义"   ,  "DO2 Pulse Width"  },
  227. { "DO3时间定义"   ,  "DO3 Pulse Width"  },
  228. { "两态控制权限" ,  "Two Control Limit"  },
  229. { "三态控制权限" ,  "Three Control Limit"  },
  230. { "开关合跳超时" ,  "Switch OverTime"  }
  231. };  
  232.     
  233. //装置参数
  234. Description_Resource IEC103_SysCfg_KOD10[ ] = {
  235. { "装置参数"       ,  "SYSTEM CONFIG"   },
  236. { "密码"         ,  "PassWord Set"    },      
  237. { "端口1通讯协议" ,  "Com. Port 1 Protocol" }, 
  238. { "端口1通讯地址" ,  "Com. Port 1 Address"   }, 
  239. { "端口1波特率" ,  "Com. Port 1 BaudRate"   },
  240. { "端口2通讯协议" ,  "Com. Port 2 Protocol"   },
  241. { "端口2通讯地址" ,  "Com. Port 2 Address"   }, 
  242. { "端口2波特率" ,  "Com. Port 2 BaudRate"   },   
  243. { "4~20mA交流量输出1定义" ,  "4-20mA Output1 Define" },      
  244. { "4~20mA交流量输出1倍数"   ,  "AO1 Ratio"   },  
  245. { "语言选择" ,  "Language"   },
  246. { "CT变比" ,  "TA Scale"   },
  247. { "PT变比" ,  "TV Scale"   },
  248. { "零序CT变比"     ,  "I0CT_scale"   },
  249. { "录波信息上送"    ,  "Send WaveData Enable"   },
  250. { "调试录波时间" ,  "Debug WaveData Time"   }          
  251. };
  252.     
  253. //动作元件
  254. Description_Resource IEC103_Action_KOD10[ ] = {
  255. { "动作元件",      "PROTECT ACTION"     },
  256. { "接地保护",      "Earthing"              }
  257. };
  258. //运行告警
  259. Description_Resource IEC103_SelfCheck_KOD10[ ] = {
  260. { "运行告警",    "DEVICE ABNORMAL"   },
  261. { "EEPROM",      "EEPROM" },
  262. { "RAM",         "RAM"                  },
  263. { "时钟",        "CLOCK"                },
  264. { "定值",        "SETTING"              },
  265. { "保护精度系数","Prot. Gains"          },
  266. { "测量精度系数","Meas. Gains"          },
  267. { "系统设置",    "System Cfg."          },
  268. { "工程配置",    "Field Cfg."           },
  269. { "开入开出配置","DI/DO Cfg."           },
  270. { "开出24V电源", "24V  Monitor"         },
  271. { "外部接线",    "CTRL Circuit "        },
  272. { "可执行代码",  "Exe. Code"            }
  273. };
  274. //遥信,目前只有12+8个,以后增加时需要更改。
  275. Description_Resource IEC103_YX_KOD10[ ] = { 
  276. { "遥信",          "REMOTE SIGNAL"         },
  277. { "开入1",         "Digital In SIGNAL 1"   },
  278. { "开入2",         "Digital In SIGNAL 2"   },
  279. { "开入3",         "Digital In SIGNAL 3"   },
  280. { "开入4",         "Digital In SIGNAL 4"   },
  281. { "开入5",         "Digital In SIGNAL 5"   },
  282. { "开入6",         "Digital In SIGNAL 6"   },
  283. { "开入7",         "Digital In SIGNAL 7"   },
  284. { "开入8",         "Digital In SIGNAL 8"   },
  285. { "开入9",         "Digital In SIGNAL 9"   },
  286. { "开入10",        "Digital In SIGNAL 10"   },
  287. { "开入11",        "Digital In SIGNAL 11"   },
  288. { "开入12",        "Digital In SIGNAL 12"   }
  289. };
  290. //保护测量
  291. Description_Resource IEC103_ProtMeas_KOD10[ ] = {
  292. { "保护测量",    "PROTECTION MEASURE"   }
  293. };
  294. //遥测
  295. Description_Resource IEC103_YC_KOD10[ ] = {
  296. { "遥测",    "REMOTE MEASURE"   }
  297. };
  298. //遥控
  299. Description_Resource IEC103_YK_KOD10[ ] = { 
  300. { "遥控",     "REMOTE CONTROL"          },
  301. #ifdef FOUROBJECTS
  302. { "通信合闸", "Communication Close" },
  303.     { "通信分闸", "Communication Trip"        },
  304. { "通信合通用1", "Com. Switch on Universal 1" },
  305.     { "通信分通用1", "Com. Switch off Universal 1"  },
  306.     { "通信合通用2", "Com. Switch on Universal 2" },
  307.     { "通信分通用2", "Com. Switch off Universal 2"  },
  308.     { "通信合通用3", "Com. Switch on Universal 3" },
  309.     { "通信分通用3", "Com. Switch off Universal 3"  }
  310. #else
  311. #ifdef TWOOBJECTS
  312. { "远方遥信启动A", "Remote DI Startup A" },
  313.     { "远方遥信停止A", "Remote DI Stop A"       },
  314. { "远方遥信启动B", "Remote DI Startup B"    },
  315.     { "远方遥信停止B", "Remote DI Stop B"     }
  316. #else
  317. { "远方遥信启动A", "Remote DI Startup A" },
  318.     { "远方遥信停止A", "Remote DI Stop A"       }
  319. #endif
  320. #endif
  321. };
  322. //遥脉
  323. Description_Resource IEC103_YM_KOD10[ ] = { 
  324. { "遥脉",        "REMOTE ENERGY"       },
  325. { "有功电能",   "Active Energy" },
  326.     { "无功电能",   "ReActive Energy"       },
  327. { "A相有功电能", "Phase A Active Energy"    },
  328.     { "A相无功电能", "Phase A ReActive Energy" },
  329. { "B相有功电能", "Phase B Active Energy"    },
  330.     { "B相无功电能", "Phase B ReActive Energy" },
  331. { "C相有功电能", "Phase C Active Energy"    },
  332.     { "C相无功电能", "Phase C ReActive Energy" }    
  333. };
  334. //扰动信息
  335. Description_Resource IEC103_Disturb_KOD10[ ] = {
  336. { "扰动数据说明",    "DISTURB MESSAGE"   }
  337. };
  338. Description_Resource IEC103_VPT_KOD10[ ] = { 
  339. { "遥信",       "VERTUAL SIGNAL"        }
  340. // { "事故总信号", "Trip Signal" },
  341. //  { "告警总信号", "Warning Signal"        },
  342. // { "自检总信号", "Selfcheck Signal"     }
  343. };
  344. /******************** 通用分类服务组的条目的描述 ********************/
  345. //查找定值或系统设置的枚举值的字符串。
  346. const char * GetEnumString( uint16 stringid )
  347. {
  348. uint16 i;
  349. const char *psz = NULL;
  350. for(i=0; i<sizeof(IEC103_Enum_String)/sizeof(IEC103_Enum_Text); i++)
  351. {
  352. if( stringid == IEC103_Enum_String[i].StringId )
  353. {
  354. if(GetSysCfgValue(ID_SYS_LANGUAGE) == LANG_CN)
  355. { psz = IEC103_Enum_String[i].cn; }
  356. else
  357. { psz = IEC103_Enum_String[i].en; }
  358. break;
  359. }
  360. }
  361. return psz;
  362. }
  363. uint16 FindPosInPROTMEAS(uint16 nID)
  364. {
  365. uint16 i;
  366. for(i=0; i<sizeof(IEC103_ProtMeas_Index)/sizeof(IEC103_Measure_Group); i++)//NUM_MEASURES
  367. {
  368. if(nID==IEC103_ProtMeas_Index[i].nID)
  369. {
  370. //*datatype = IEC103_ProtMeas_Index[i].datatype;
  371. //*combineflag = IEC103_ProtMeas_Index[i].bcombine;
  372. return i;
  373. }
  374. }
  375. }
  376. ////////////////////////////////////////////////////////////////////
  377. /*****************************SOE处理函数**************************/
  378. #define SOE_SI_OVERTIME 20000 //20S超时
  379. TSOE_SI_DEAL_STRUCT _soe_si_struct;
  380. //取消对应端口的SOE发送态,发送指针恢复(主要用于SOE发送不成功后的处理)
  381. void soe_si_CancelSOESend(uint16 uPort)
  382. {
  383. memset(&_soe_si_struct.SoePort[uPort], 0, sizeof(TSOE_SI_PORT));
  384. _soe_si_struct.SoePort[uPort].bInSoeSend = FALSE;
  385. // _soe_si_struct.SoePort[uPort].nOpenSoeCount = 0;
  386. // _soe_si_struct.SoePort[uPort].nSendSoeType = 0;
  387. }
  388. /*
  389. uint32 soe_si_HaveSOEToSend(uint8 uPort)
  390. {
  391. // TSOESave *psoesave = &(Ram.Eeprom.SOESave);
  392. TSOESave *psoesave = &(ExramSOESave.SOESave);
  393. if(_soe_si_struct.SoePort[uPort].bInSoeSend)
  394. { return TRUE; }
  395. else if(
  396. (psoesave->ActionSOESave.comm_index[uPort] !=psoesave->ActionSOESave.current_index)
  397.   ||(psoesave->AbnormalSOESave.comm_index[uPort] !=psoesave->AbnormalSOESave.current_index)
  398.   ||(psoesave->DigitalSOESave.comm_index[uPort] !=psoesave->DigitalSOESave.current_index) )
  399. { return TRUE; }
  400. return FALSE;
  401. }
  402. */
  403. uint32 IEC103_SOE_DealFlag(uint8 uPort)
  404. {
  405. uint16 newsoe_num = 0;
  406. uint16 newsoe_type = 0;
  407. uint16 soe_mask = (1<<SOE_ACTION)|(1<<SOE_DIGITAL)|(1<<SOE_ABNORMAL);
  408. // TSOESave *psoesave = &(Ram.Eeprom.SOESave);
  409. TSOESave *psoesave = &(ExramSOESave.SOESave);
  410. if(!_soe_si_struct.SoePort[uPort].bInSoeSend) //if(*pSoeNeedSendType == 0)
  411. {
  412. if(psoesave->ActionSOESave.comm_index[uPort] !=psoesave->ActionSOESave.current_index)
  413. {
  414. newsoe_type = 1<<SOE_ACTION;
  415. newsoe_num = ( NUM_ACTIONSOE + psoesave->ActionSOESave.current_index
  416. - psoesave->ActionSOESave.comm_index[uPort])%NUM_ACTIONSOE;
  417. }
  418. else if(psoesave->AbnormalSOESave.comm_index[uPort] !=psoesave->AbnormalSOESave.current_index)
  419. {
  420. newsoe_type = 1<<SOE_ABNORMAL;
  421. newsoe_num = ( NUM_ABNORMALSOE + psoesave->AbnormalSOESave.current_index
  422. - psoesave->AbnormalSOESave.comm_index[uPort])%NUM_ABNORMALSOE;
  423. }
  424. else if(psoesave->DigitalSOESave.comm_index[uPort] !=psoesave->DigitalSOESave.current_index)
  425. {
  426. newsoe_type = 1<<SOE_DIGITAL;
  427. newsoe_num = ( NUM_DIGITALSOE + psoesave->DigitalSOESave.current_index
  428. - psoesave->DigitalSOESave.comm_index[uPort])%NUM_DIGITALSOE;
  429. }
  430. _soe_si_struct.SoePort[uPort].nSendSoeType = newsoe_type&soe_mask;
  431. _soe_si_struct.SoePort[uPort].nSendSoeCount = newsoe_num;
  432. }
  433. return _soe_si_struct.SoePort[uPort].nSendSoeType;
  434. }
  435. //上次组包的SOE发送完毕
  436. void soe_si_ConfirmSOESend(uint16 uPort)
  437. {
  438. TSOE_SI_PORT * pSoePort = &_soe_si_struct.SoePort[uPort];
  439. uint16 i,opencnt;
  440. opencnt = pSoePort->nOpenSoeCount;
  441. i = opencnt;
  442. if(pSoePort->nSendSoeType & (1<<SOE_ACTION) )
  443. {
  444. while(i--)
  445. {
  446. // eepwri_SentOneActionSOE(uPort);
  447. exramwri_SentOneActionSOE(uPort);
  448. }
  449. }
  450. else if(pSoePort->nSendSoeType & (1<<SOE_ABNORMAL) )
  451. {
  452. while(i--)
  453. {
  454. // eepwri_SentOneAbnormalSOE(uPort);
  455. exramwri_SentOneAbnormalSOE(uPort);
  456. }
  457. }
  458. else if(pSoePort->nSendSoeType & (1<<SOE_DIGITAL) )
  459. {
  460. while(i--)
  461. {
  462. // eepwri_SentOneDigitalSOE(uPort);
  463. exramwri_SentOneDigitalSOE(uPort);
  464. }
  465. }
  466. pSoePort->bInSoeSend = FALSE;
  467. pSoePort->nSendSoeType = 0;
  468. pSoePort->nSendSoeCount = 0;
  469. pSoePort->nOpenSoeCount = 0;
  470. pSoePort->nTimer = 0;
  471. // pSoePort->pSendSoePtr = NULL;
  472. }
  473. //通讯任务中接口调用处理(可以不进行该接口调用)
  474. void soe_si_DealProc_InTask(uint32 nms,uint16 uPort)
  475. {
  476. // TSOESave *psoesave = &(Ram.Eeprom.SOESave);
  477. TSOE_SI_PORT * pSoePort = &_soe_si_struct.SoePort[uPort];
  478. //NET1/2
  479. if(pSoePort->bInSoeSend)
  480. {
  481. pSoePort->nTimer+=nms;
  482. if(pSoePort->nTimer > SOE_SI_OVERTIME)
  483. {
  484.   soe_si_CancelSOESend(uPort); //超时取消SOE发送
  485. }
  486. }
  487. else
  488. {
  489. pSoePort->nTimer = 0;
  490. //需要调用? 
  491. IEC103_SOE_DealFlag(uPort);
  492. }
  493. }
  494. ////////////////////////////////////////////////////////////////////
  495. /*****************************遥控处理函数**************************/
  496. // 定义遥控操作超时
  497. #define TIME_CONTROL_OVERTIME 10000 //(5*OS_TICKS_PER_SEC) // 5S超时
  498. //(TBuffDBJ * pBuff, uint16 * pInfo)
  499. //ctrl中为指令,info中为结果或错误标志
  500. void IEC103_RCtrl_Logic(uint8 nCtrlCode, uint8 nFUN, uint8 nINF, uint8 dpi_code, int32 * ctrl, int32 * info)
  501. {
  502. int16 control_obj;
  503. uint16 nType,nCommand,nCheckResult;
  504. int16 nResult=-1;
  505. int32 nOverTime = TIME_CONTROL_OVERTIME;
  506. //检查装置当前控制权限是就地还是远方
  507. if (GetDeviceModelValue(ID_DEVICEMODEL_NumControlLimit)==TWO_CONTROLLIMIT)
  508. {
  509. if(GetCurrentControlLimit()!=CONTROL_LMT_REMOTE)
  510. {
  511. *info=ID_CTRLRESULT_UNREMOTE; //报错,装置不在远方,不允许通讯控制
  512. return ;
  513. }
  514. }
  515. else if (GetDeviceModelValue(ID_DEVICEMODEL_NumControlLimit)==THREE_CONTROLLIMIT)
  516. {
  517. if(GetCurrentControlLimit()!=CONTROL_LMT_COMM)
  518. {
  519. *info=ID_CTRLRESULT_DISABLE; //报错,装置不在通讯,不允许通讯控制
  520. return ;
  521. }
  522. }
  523. /*****
  524. 遥控报文结构
  525. 控制指令(选择/执行/撤销)
  526. 控制FUN
  527. 控制INF
  528. 控制类型(合/分 升/降/停...)
  529. ******/
  530. if(nCtrlCode == DR_REMOTE_CTRL_C_CANCEL) //遥控撤销指令
  531. {
  532. //遥控撤销指令,撤销当前控制
  533. //ResetControlCode();
  534. memset(&yk_ctrlinfo, 0, sizeof(TCONTROL_INFO));
  535. *info=ID_CTRLRESULT_SUCCESS; //撤销成功
  536. *ctrl = DR_REMOTE_CTRL_R_CANCEL;
  537. return;
  538. }
  539. /*** 根据控制指令处理,遥控指令返回 ***/
  540. switch(nCtrlCode)
  541. {
  542. case DR_REMOTE_CTRL_C_SELECT:
  543. {
  544. *ctrl = DR_REMOTE_CTRL_R_SELECT;
  545. }
  546. break;
  547. case DR_REMOTE_CTRL_C_EXEC:
  548. {
  549. *ctrl = DR_REMOTE_CTRL_R_EXEC;
  550. }
  551.     break;
  552. default:
  553. {
  554. *ctrl = nCtrlCode;
  555. *info=ID_CTRLRESULT_COMMAND; //未知指令,返回NAK
  556. return;
  557. }
  558. }
  559. control_obj = -1;
  560. //根据FUN和INF检索当前是否存在此对象
  561. if( (nFUN==IEC103_YK_FUN) &&(nINF>=IEC103_YK_FIRSTINF) && (nINF<=IEC103_YK_FIRSTINF+CTRLCMD_OBJECT_NUM-CTRLCMD_OBJECT1) )
  562. { control_obj = nINF - IEC103_YK_FIRSTINF + CTRLCMD_OBJECT1; }
  563. if(control_obj == -1) // 对象不存在
  564. {
  565. *info=ID_CTRLRESULT_OBJECT; // 对象不存在
  566. return;
  567. }
  568. else if(dpi_code!=CTRLCMD_TRIP && dpi_code!=CTRLCMD_CLOSE)
  569. {
  570. *info=ID_CTRLRESULT_COMMAND; // 指令错误
  571. return;
  572. }
  573. else
  574. {
  575. if(control_obj==CTRLCMD_OBJECT1)
  576. {
  577. if(dpi_code==CTRLCMD_CLOSE)
  578. {
  579. nCommand=CTRLCMD_ASTARTUP;
  580. nType=CONTROL_ASTARTUP_COMM;
  581. }
  582. else if(dpi_code==CTRLCMD_TRIP)
  583. {
  584. nCommand=CTRLCMD_STOP;
  585. nType=CONTROL_STOP_COMM;
  586. }
  587. }
  588. //#if(CTRLCMD_OBJECT_NUM==2)
  589. #ifdef TWOOBJECTS
  590. else if(control_obj==CTRLCMD_OBJECT2)
  591. {
  592. if(dpi_code==CTRLCMD_CLOSE)
  593. {
  594. nCommand=CTRLCMD_BSTARTUP;
  595. nType=CONTROL_BSTARTUP_COMM;
  596. }
  597. else if(dpi_code==CTRLCMD_TRIP)
  598. {
  599. nCommand=CTRLCMD_STOP;
  600. nType=CONTROL_STOP_COMM;
  601. }
  602. }
  603. #endif
  604. //#if CTRLCMD_OBJECT_NUM==4 //FOUROBJECTS
  605. #ifdef FOUROBJECTS
  606. else if(control_obj==CTRLCMD_OBJECT2)
  607. {
  608. if(dpi_code==CTRLCMD_CLOSE)
  609. {
  610. nCommand=CTRLCMD_UNIVERSAL1ON;
  611. nType=CONTROL_UNIVERSAL1ON_COMM;
  612. }
  613. else if(dpi_code==CTRLCMD_TRIP)
  614. {
  615. nCommand=CTRLCMD_UNIVERSAL1OFF;
  616. nType=CONTROL_UNIVERSAL1OFF_COMM;
  617. }
  618. }
  619. else if(control_obj==CTRLCMD_OBJECT3)
  620. {
  621. if(dpi_code==CTRLCMD_CLOSE)
  622. {
  623. nCommand=CTRLCMD_UNIVERSAL2ON;
  624. nType=CONTROL_UNIVERSAL2ON_COMM;
  625. }
  626. else if(dpi_code==CTRLCMD_TRIP)
  627. {
  628. nCommand=CTRLCMD_UNIVERSAL2OFF;
  629. nType=CONTROL_UNIVERSAL2OFF_COMM;
  630. }
  631. }
  632. else if(control_obj==CTRLCMD_OBJECT4)
  633. {
  634. if(dpi_code==CTRLCMD_CLOSE)
  635. {
  636. nCommand=CTRLCMD_UNIVERSAL3ON;
  637. nType=CONTROL_UNIVERSAL3ON_COMM;
  638. }
  639. else if(dpi_code==CTRLCMD_TRIP)
  640. {
  641. nCommand=CTRLCMD_UNIVERSAL3OFF;
  642. nType=CONTROL_UNIVERSAL3OFF_COMM;
  643. }
  644. }
  645. #endif
  646. else
  647. {
  648. *info=ID_CTRLRESULT_OBJECT;
  649. return;
  650. }
  651. }
  652. //检查完成,可以处理遥控选择与遥控执行了!
  653. /*** 遥控选择处理 ***/
  654. if(nCtrlCode == DR_REMOTE_CTRL_C_SELECT)
  655. {
  656. //ClearControlCode(); //不管怎样,先清指令
  657. //SetCtrlResult(ID_CTRLRESULT_SUCCESS); //成功,总是选择成功
  658. //nResult = GetCurrentControlResult();
  659. //设置当前控制选择指令
  660. yk_ctrlinfo.nCtrlObjID = control_obj;
  661. yk_ctrlinfo.nCtrlCmd = nCommand;
  662. yk_ctrlinfo.bComplete = FALSE;
  663. yk_ctrlinfo.nCtrlCode = DR_REMOTE_CTRL_C_SELECT;
  664. yk_ctrlinfo.nCtrlResult = ID_CTRLRESULT_SUCCESS;
  665. yk_ctrlinfo.nCtrlCode = 0;
  666. yk_ctrlinfo.bComplete = TRUE;
  667. nResult = yk_ctrlinfo.nCtrlResult;
  668. }
  669. /*** 遥控执行处理 ***/
  670. else if(nCtrlCode == DR_REMOTE_CTRL_C_EXEC)
  671. {
  672. //命令检查,和前面的遥控选择匹配 zhongwei 2009-03-11 软压板和遥控同样需要先发送遥控选择指令
  673. if( yk_ctrlinfo.nCtrlObjID == control_obj && yk_ctrlinfo.nCtrlCmd==nCommand )
  674. {
  675. //设置当前控制执行指令
  676. yk_ctrlinfo.bComplete = FALSE;
  677. yk_ctrlinfo.nCtrlCode = DR_REMOTE_CTRL_C_EXEC;
  678. }
  679. else
  680. {
  681. //与前次选择不匹配,或者没有进行选择直接执行
  682. *info=ID_CTRLRESULT_SEQUENCE; //序列错
  683. return;
  684. }
  685. }
  686. //执行遥控指令,只需要添加指令即可
  687. if(nCtrlCode == DR_REMOTE_CTRL_C_EXEC)
  688. {
  689. //生成操作SOE
  690. //待改 soe_AddNewOperateSOE(ID_RUN_REMOTE_CONTROL);
  691. /////////////////////////////////////////
  692. //控制操作,返回指令检查结果
  693. nCheckResult=ControlProc_ByComm(nCommand, nType);
  694. *info=nCheckResult;
  695. if(nCheckResult!=CTRLCMD_CHECK_OK)
  696. {
  697. return;
  698. }
  699. yk_ctrlinfo.bComplete = TRUE; //指令添加正确
  700. yk_ctrlinfo.nCtrlResult = nCheckResult;
  701. //if(D_ControlObject_Define[nObject].bReCheck)//检查控制对象是否需要真返校
  702. if(1) //固定为需要返校
  703. {
  704. // 真返校 等待选择/执行指令完成,以及超时处理
  705. while (nOverTime>0)
  706. {
  707. nOverTime--;
  708. if(yk_ctrlinfo.bComplete)/*遥控执行完成*/
  709. {
  710. nResult = yk_ctrlinfo.nCtrlResult; //获取结果
  711. break;
  712. }
  713. }
  714. if(nResult == -1) //超时到,仍然没有结果返回
  715. {
  716. nResult = ID_CTRLRESULT_OVERTIME;
  717. }
  718. }
  719. else
  720. {
  721. // 假返校 不需要等执行完成,直接返回 
  722. if(nCtrlCode == DR_REMOTE_CTRL_C_SELECT) //遥控选择
  723. {
  724. yk_ctrlinfo.nCtrlCode = 0; //ClearControlCode(); //不管怎样,先清指令
  725. yk_ctrlinfo.nCtrlResult = (ID_CTRLRESULT_SUCCESS); //成功,总是选择成功
  726. nResult = yk_ctrlinfo.nCtrlResult;
  727. }
  728. else if(nCtrlCode == DR_REMOTE_CTRL_C_EXEC) //遥控执行
  729. {
  730. while (nOverTime>0) //等待遥控执行完成或超时
  731. {
  732. nOverTime--;
  733. if(yk_ctrlinfo.bComplete)/*遥控执行完成*/
  734. {
  735. nResult = yk_ctrlinfo.nCtrlResult; //获取结果
  736. break;
  737. }
  738. }
  739. if(nResult == -1) //超时到,仍然没有结果返回
  740. {
  741. nResult = ID_CTRLRESULT_OVERTIME;
  742. }
  743. }
  744. }
  745. }//执行完毕
  746. //如果遥控校验失败或者在遥控执行下
  747. if(nResult!=ID_CTRLRESULT_SUCCESS || nCtrlCode == DR_REMOTE_CTRL_C_EXEC)
  748. {
  749. //清遥控信息
  750. memset(&yk_ctrlinfo, 0, sizeof(TCONTROL_INFO)); //ResetControlCode();
  751. }
  752. *info = nResult;
  753. return;
  754. }