dpv1_ReadWrite.c
上传用户:hualang
上传日期:2022-04-11
资源大小:104k
文件大小:56k
开发平台:

C/C++

  1. ///////////////////////////////////////////////////////////////
  2. // 文 件 名 : dpv1_ReadWrite.c
  3. // 文件功能 : DPV1非周期读写
  4. // 作    者 : 
  5. // 创建时间 : 
  6. // 项目名称 : LPC3
  7. // 操作系统 : 
  8. // 备    注 :
  9. // 历史记录 : 
  10. //
  11. //
  12. ///////////////////////////////////////////////////////////////
  13. #include "....includeLmcInc.h"
  14. #include "....includePublic.h"
  15. #include "....includeProtLogic.h"
  16. #include "....includeCtrlLogic.h"
  17. #include "....includesoe.h"
  18. #include "E5_Commu_PtlProfibus.h"
  19. extern int16 ProcessRemoteCtrlExec(uint8 control_obj, uint8 control_code, uint16 * pInfo);
  20. extern uint16 GetCurSampleFreq(void);
  21. extern int16  profi_ModifySettings(int16 nIDOffset, uint8 * pBuff, uint16 nBufLen, uint8 bBigEdin, uint16 * pInfo);
  22. extern void   SignalReset(uint16 reset_type);
  23. #define BIT_CONVERT_FP32_TO_UINT32(fl) (*((uint32 *)((fp32 *)(&fl))))
  24. #define TEN_MULTIPLE(n) TenMultiple[n]
  25. #define CURRENT_LANG        GetSysCfgValue(ID_SYS_LANGUAGE)
  26. #define CRC_CODE            Ram.CodeChkSum //程序CRC校验码
  27. typedef struct
  28. {
  29. const char * strArr[2];
  30. }TStringResource;
  31. //组装非周期数据的缓存区
  32. static  uint8 m_nSendCount;
  33. static  uint8 m_SendBuffer[256];
  34. static   uint8 m_nSoeType;
  35. static   uint16 m_nSoeIndex;
  36. //报文显示使用的字符串资源
  37. static const TStringResource g_strAction[]=
  38. {
  39. "接地保护",      "Earthing",
  40. "","",
  41. "","",
  42. };
  43. static const TStringResource g_strAbnormal[]=
  44. {
  45. "EEPROM",      "EEPROM",
  46. "RAM",         "RAM",
  47. "时钟",        "CLOCK",
  48. "定值",        "SETTING",
  49. "保护精度系数","Prot. Gains",
  50. "测量精度系数","Meas. Gains",
  51. "系统设置",    "System Cfg.",
  52. "工程配置",    "Field Cfg.",
  53. "开入开出配置","DI/DO Cfg.",
  54. "开出24V电源", "24V  Monitor",
  55. "外部接线",    "CTRL Circuit ",
  56. "可执行代码",  "Exe. Code",
  57. "","",
  58. "","",
  59. "","",
  60. };
  61. static const TStringResource g_strRun[]=
  62. {
  63. "冷启动",       "Cool startup",
  64. "面板复归",     "Panel Revert",
  65. "开入信号复归", "DI Revert",
  66. "通讯复归",     "Com. Revert",
  67. "修改定值",     "Modify Settings",
  68. "EEPROM初始化", "Init. EEPROM",
  69. "进入调试态",   "Enter Debug",
  70. "退出调试态",   "Exit Debug",
  71. "","",
  72. "","",
  73. "","",
  74. };
  75. static const TStringResource g_strControl[]=
  76. {
  77. "面板合闸",      "Panel Switch On",
  78. "面板分闸",      "Panel Switch Off",
  79. "本地端子分闸",  "Local DI Switch On",
  80. "本地端子合闸",  "Local DI Switch Off",
  81. "远方端子分闸",  "Remote DI Switch Off",
  82. "远方端子合闸",  "Remote DI Switch On",
  83. "通讯合闸",      "Commu. Switch On",
  84. "通讯分闸",      "Commu. Switch Off",
  85. "合闸失败",      "Switch On Failure",
  86. "分闸失败",      "Switch Off Failure",
  87. "分通用继电器1",  "Commu. Switch Off DO1",
  88. "合通用继电器1",  "Commu. Switch On DO1",
  89. "分通用继电器2",  "Commu. Switch Off DO2",
  90. "合通用继电器2",  "Commu. Switch On DO2",
  91. "分通用继电器3",  "Commu. Switch Off DO3",
  92. "合通用继电器3",  "Commu. Switch On DO3",
  93. "分通用继电器4",  "Commu. Switch Off DO4",
  94. "合通用继电器4",  "Commu. Switch On DO4",
  95. "","",
  96. "","",
  97. "","",
  98. };
  99. static const TStringResource g_strVirtualDI[]=
  100. {
  101. "本地远程",         "Local/Remote",
  102. "控制权限辅助开入", "Control Limit",
  103. "分闸状态",         "Switch Off",
  104. "合闸状态",         "Switch On",
  105. "脱扣状态",         "Dropaway",
  106. "工作位置",         "Work Status",
  107. "试验位置",         "Test Status",
  108. "分闸命令",         "Switch Off",
  109. "合闸命令",         "Switch On",
  110. "就地分闸命令",     "Switch Off Local",
  111. "就地合闸命令",     "Switch On Local",
  112. "远方分闸命令",     "Switch Off Remote",
  113. "远方合闸命令",     "Switch On Remote",
  114. "复归命令",         "Signal Reset",
  115. "退出所有保护",     "Exit All PROT",
  116. // "控制电源状态",       "Control Power Status", 
  117. "开入预留定义1",    "DI Reserved1",
  118. "开入预留定义2",    "DI Reserved2",
  119. "","",
  120. "","",
  121. };
  122. static const TStringResource g_strUtility[]=
  123. {
  124. "[常开]","[NO]",
  125. "[常闭]","[NC]",
  126. "[成功]","[SUCCESS]",
  127. "[据跳]","[TRIP FAIL]",
  128. "[据合]","[CLOSE FAIL]",
  129. "[告警]","[WARNING]",
  130. "[失败]","[FAILURE]",
  131. "","",
  132. "","",
  133. "","",
  134. };
  135. enum{
  136.    ID_UTILITY_NO,
  137.    ID_UTILITY_NC,
  138.    ID_UTILITY_ACT_RESULT_SUCCESS,
  139.    ID_UTILITY_ACT_RESULT_TRIPFAIL,
  140.    ID_UTILITY_ACT_RESULT_CLOSEFAIL,
  141.    ID_UTILITY_ACT_RESULT_WARNING,
  142.    ID_UTILITY_ACT_RESULT_FAIL
  143. };
  144. //获取物理开入的名称
  145. static const char * str_GetRealDiNameString(int nRealID)
  146. {
  147. static char szBuffer[40];
  148. char szTmp[32];
  149. memset(szBuffer, 0, sizeof(szBuffer));
  150. //开入名
  151.     sprintf(szTmp, "DI%d", nRealID+1);
  152. strcat(szBuffer, szTmp);
  153. //常开常闭
  154. if(Ram.Current_DiDoConfig.DiOpenOrClose[nRealID] == DI_NORMAL_OPEN)
  155. {
  156. strcat(szBuffer, g_strUtility[ID_UTILITY_NO].strArr[CURRENT_LANG] );
  157. }
  158. else
  159. {
  160. strcat(szBuffer, g_strUtility[ID_UTILITY_NC].strArr[CURRENT_LANG] );
  161. }
  162. strcat(szBuffer, " ");
  163. //虚拟开入
  164. if (Ram.Current_DiDoConfig.DiOpenOrClose[nRealID]&0xff != 0xFF) 
  165. {
  166. strcat(szBuffer, g_strVirtualDI[nRealID].strArr[CURRENT_LANG] ) ;
  167. }
  168. return szBuffer;
  169. }
  170. uint8 AssembByte(uint8* pDest, uint8 nBtVal)
  171. {
  172. *pDest = nBtVal;
  173.     return 1;
  174. }
  175. uint8 AssembNBytes(uint8* pDest, const uint8 * p, uint32 count)
  176. {
  177. memcpy(pDest, p, count);
  178.     return count;
  179. }
  180. void AssembBit(uint8* pDest, uint8 nBitPos, uint8 nBitVal)
  181. {
  182. uint8 nLeftBit = (nBitPos%8);
  183. uint8 nBytePos = (nBitPos/8);
  184.   
  185.    if (nBitVal)
  186.        *(pDest+nBytePos) |= (1<<nLeftBit);
  187. else
  188.        *(pDest+nBytePos) &= ~(1<<nLeftBit);
  189. }
  190. uint8 AssembWordLittleEdin(uint8* pDest, uint16 nWordVal)
  191. {
  192. *pDest     = LOBYTE(nWordVal);
  193. *(pDest+1) = HIBYTE(nWordVal);
  194. return 2;
  195. }
  196. uint8 AssembWordBigEdin(uint8* pDest, uint16 nWordVal)
  197. {
  198. *pDest     = HIBYTE(nWordVal);
  199. *(pDest+1) = LOBYTE(nWordVal);
  200. return 2;
  201. }
  202. uint8 AssembDWordBigEdin(uint8* pDest, uint32 nDWordVal)
  203. {
  204. *pDest     = HIBYTE(HIWORD(nDWordVal));
  205. *(pDest+1) = LOBYTE(HIWORD(nDWordVal));
  206. *(pDest+2) = HIBYTE(LOWORD(nDWordVal));
  207. *(pDest+3) = LOBYTE(LOWORD(nDWordVal));
  208. return 4;
  209. }
  210. uint8 AssembDWordLittleEdin(uint8* pDest, uint32 nDWordVal)
  211. {
  212. *(pDest+0) = LOBYTE(LOWORD(nDWordVal));
  213. *(pDest+1) = HIBYTE(LOWORD(nDWordVal));
  214. *(pDest+2) = LOBYTE(HIWORD(nDWordVal));
  215. *(pDest+3) = HIBYTE(HIWORD(nDWordVal));
  216. return 4;
  217. }
  218. uint8 DissembWordLittleEdin(uint8* pDest, uint16* nWordVal)
  219. {
  220. *nWordVal = MAKEWORD( LOBYTE(*(pDest)), LOBYTE(*(pDest+1)));
  221. return 2;
  222. }
  223. uint8 DissembWordBigEdin(uint8* pDest, uint16* nWordVal)
  224. {
  225. *nWordVal = MAKEWORD(*(pDest+1) & 0xff, *pDest & 0xff);
  226. return 2;
  227. }
  228. //读定值,公司主控连接
  229. static int ProcessC2ReadProtSettingsWiscom(uint8 nIndex, uint8 nReadLen, uint8* nErrCode1, uint8* nErrCode2)
  230. {
  231. int id;
  232. m_nSendCount = 0;
  233. for (id = 0; id< NUM_SETTINGS ;id++)
  234. {
  235. int32 nVal = GetSettingValue(id);
  236. m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], nVal);
  237. }
  238. return  DPV1_OK;
  239. }
  240. //读表计数值,内部使用,低字节在前
  241. static int ProcessC1ReadEgyInfoWiscom(uint8 nIndex, uint8 nReadLen, uint8* nErrCode1, uint8* nErrCode2)
  242. {
  243. uint32 u32Value;
  244. m_nSendCount = 0;
  245. u32Value = Ram.TotalEnergy.PE;
  246. m_nSendCount += AssembDWordLittleEdin(&m_SendBuffer[m_nSendCount], u32Value);
  247. u32Value = Ram.TotalEnergy.QE;
  248. m_nSendCount += AssembDWordLittleEdin(&m_SendBuffer[m_nSendCount], u32Value);
  249. return  DPV1_OK;
  250. }
  251. //读设备软件版本信息
  252. static int ProcessReadDeviceInfoWiscom(void)
  253. {
  254. char strVersion[12]; //版本信息固定为12个字节
  255. memset(strVersion,0,12);
  256. m_nSendCount = 0;
  257. //装置类型,字符串 固定12个字符,方便主站处理
  258. strcpy(strVersion,device_model);
  259. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount],(uint8 *)strVersion, 12);
  260.     m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], SOFTWARE_VERSION);
  261. return  DPV1_OK;
  262. }
  263. //读录波配置
  264. static int ProcessWaveCfgWiscom(uint8 nIndex)
  265. {
  266.     int i;
  267. m_nSendCount = 0;
  268. //录波数据格式
  269. m_SendBuffer[m_nSendCount++] = 2;//采样数据
  270. //录波报文总共包数
  271. m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], WaveRecord.Config.MsgCount);
  272. //录波数据长度
  273. m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], WaveRecord.Config.Length);
  274. //模拟通道的数目 //M=1,2,……9,为模拟通道标号,最大为9;
  275. m_SendBuffer[m_nSendCount++]=NUM_SIMPLE_WAVEDATA_CHANNELS;
  276. m_SendBuffer[m_nSendCount++]=NUM_REAL_DI_COUNT;
  277. for(i=0;i<NUM_SIMPLE_WAVEDATA_CHANNELS;i++)
  278. {
  279. //模拟通道1标识
  280. m_SendBuffer[m_nSendCount++]=i;
  281. //通道系数
  282. m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], WaveRecord.Config.Analog[i].max);
  283. //偏移量
  284. m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], 0);
  285. //采样时滞
  286. m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], WaveRecord.Config.Analog[i].skew);
  287. //采样最小值
  288. m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], (uint16)-2048);
  289. //采样最大值
  290. m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], (uint16)2047);
  291. }
  292. //状态通道标识
  293. for(i=0; i<NUM_REAL_DI_COUNT; i++)
  294. {
  295. m_SendBuffer[m_nSendCount++]=i;
  296. }
  297. //系统频率
  298. m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], 5000);// 系统频率
  299. //采样频率数目
  300. m_SendBuffer[m_nSendCount++]=1;
  301. //采样频率
  302. m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], GetCurSampleFreq()); //采样频率*/
  303. //采样频率对应的最后一点
  304. m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], WaveRecord.Config.Length);// 系统频率
  305. //录波启动原因:上送1个
  306. for(i=0;i<1;i++)
  307. {
  308. //启动录波1原因
  309. m_nSendCount += AssembDWordLittleEdin(&m_SendBuffer[m_nSendCount], WaveRecord.Config.Start[i].Cause);
  310. //启动录波1时间 
  311. m_SendBuffer[m_nSendCount++]=WaveRecord.Config.Start[i].Time.y;
  312. m_SendBuffer[m_nSendCount++]=WaveRecord.Config.Start[i].Time.mon;
  313. m_SendBuffer[m_nSendCount++]=WaveRecord.Config.Start[i].Time.d;
  314. m_SendBuffer[m_nSendCount++]=WaveRecord.Config.Start[i].Time.h;
  315. m_SendBuffer[m_nSendCount++]=WaveRecord.Config.Start[i].Time.min;
  316. m_SendBuffer[m_nSendCount++]=WaveRecord.Config.Start[i].Time.s;
  317. m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], WaveRecord.Config.Start[i].Time.ms);
  318. }
  319. //录波动作原因
  320. m_SendBuffer[m_nSendCount++]=1;
  321. m_SendBuffer[m_nSendCount++]=0;
  322. m_SendBuffer[m_nSendCount++]=0;
  323. m_SendBuffer[m_nSendCount++]=0;
  324. m_SendBuffer[m_nSendCount++]=8;
  325. m_SendBuffer[m_nSendCount++]=8;
  326. m_SendBuffer[m_nSendCount++]=8;
  327. m_SendBuffer[m_nSendCount++]=8;
  328. m_SendBuffer[m_nSendCount++]=8;
  329. m_SendBuffer[m_nSendCount++]=8;
  330. m_SendBuffer[m_nSendCount++]=8;
  331. m_SendBuffer[m_nSendCount++]=8;
  332. //时标的倍增系数
  333. m_SendBuffer[m_nSendCount++]=0;    
  334. return  DPV1_OK;
  335. }
  336. //读录波数据
  337. static int ProcessWaveDataWiscom(uint8 nSlot, uint8 nIndex, uint8* nErrCode1, uint8* nErrCode2)
  338. {
  339. uint16 info;
  340.     int i,h;
  341. uint32 temp1;
  342. m_nSendCount = 0;
  343. //info 从1开始 index:0~254
  344. info = (nSlot-SlotNum_Read_WaveData_Sample_Zone0)*255 + nIndex+1;
  345. //总包数判断
  346. if (info > WaveRecord.Config.MsgCount)
  347. {
  348. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  349. *nErrCode2 = ErrCode2_Read_WaveData;
  350. return DPV1_NOK;
  351. }
  352. temp1=WaveRecord.Config.Length%WAVE_MSG_AMOUNT;
  353. m_SendBuffer[m_nSendCount++]=info;  //数据包数
  354. m_SendBuffer[m_nSendCount++]=info>>8;
  355. if((temp1!=0) && (info==WaveRecord.Config.MsgCount))  // 最后一包(不是一整包)
  356. {
  357. for(i=(info-1)*WAVE_MSG_AMOUNT;i<(info-1)*WAVE_MSG_AMOUNT+temp1;i++)  //i为数据点数
  358. {
  359. for(h=0;h<NUM_SIMPLE_WAVEDATA_CHANNELS;h++)//每一点传所有通道
  360. {
  361. //数据
  362. m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], WaveRecord.Data.Analog[h][i]);
  363. }
  364. m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], WaveRecord.Data.Ki[i]); //每一点传一次开入信息
  365. }
  366. }
  367. else
  368. {
  369. for(i=(info-1)*WAVE_MSG_AMOUNT;i<info*WAVE_MSG_AMOUNT;i++)
  370. {
  371. for(h=0;h<NUM_SIMPLE_WAVEDATA_CHANNELS;h++)
  372. {
  373. //数据
  374. m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], WaveRecord.Data.Analog[h][i]);
  375. }
  376. m_nSendCount += AssembWordLittleEdin(&m_SendBuffer[m_nSendCount], WaveRecord.Data.Ki[i]); //每一点传一次开入信息
  377. }
  378. }
  379. return  DPV1_OK;
  380. }
  381. //读系统信息
  382. static void ProcessC2ReadSysInfo(void)
  383. {
  384. char strTmp[32];
  385. TDateTime dt;
  386. m_nSendCount = 0;
  387. //软件版本 32字节
  388. strcpy(strTmp, main_soft_ver);
  389. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount],(uint8 *)strTmp, 32);
  390. //编译时间 32字节
  391. dt = Ram.dtBuildTime;
  392. sprintf(strTmp,"%04u-%02u-%02u %02u:%02u:%02u",(dt.y+2000)%10000,dt.mon%100,dt.d%100,dt.h,dt.min,dt.s);
  393. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount],(uint8 *)strTmp, 32);
  394. //加载时间 32字节
  395. dt = Ram.dtLoadTime;
  396. sprintf(strTmp,"%04u-%02u-%02u %02u:%02u:%02u",(dt.y+2000)%10000,dt.mon%100,dt.d%100,dt.h,dt.min,dt.s);
  397. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount],(uint8 *)strTmp, 32);
  398. //CRC校验 8字节
  399. sprintf(strTmp, "0x%04X", CRC_CODE);
  400. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount],(uint8 *)strTmp, 8);
  401. //物理开入数目
  402. m_nSendCount += AssembByte(&m_SendBuffer[m_nSendCount], DI_REALCOUNT);
  403. //物理开出数目
  404. m_nSendCount += AssembByte(&m_SendBuffer[m_nSendCount], NUM_REAL_DO_COUNT);
  405. }
  406. //读工程配置
  407. static void ProcessC2ReadDeviceModel(void)
  408. {
  409. int id;
  410. m_nSendCount = 0;
  411. for (id = 0; id< NUM_DEVICEMODELS ;id++)
  412. {
  413. int32 nVal = GetDeviceModelValue(id);
  414. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount], nVal);
  415. }
  416. }
  417. //读系统设置
  418. static void ProcessC2ReadSysCfg(void)
  419. {
  420. //特殊处理,只上送需要显示的量
  421. int id;
  422. int16 nVal;
  423. m_nSendCount = 0;
  424. for (id = ID_SYS_OUTPUTI1; id< NUM_SYSCFGS ;id++)
  425. {
  426. nVal = GetSysCfgValue(id);
  427. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount], nVal);
  428. }
  429. }
  430. //读保护定值(外部系统)
  431. static void ProcessC2ReadProtSettings(void)
  432. {
  433. int id;
  434. m_nSendCount = 0;
  435. for (id = 0; id< NUM_SETTINGS ;id++)
  436. {
  437. int32 nVal = GetSettingValue(id);
  438. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount], nVal);
  439. }
  440. }
  441. //读开入配置
  442. static void ProcessC2ReadDiCfg(void)
  443. {
  444. int nID;
  445. m_nSendCount = 0;
  446. for (nID=0; nID<DI_REALCOUNT; nID++)
  447. {
  448. //关联的虚拟ID
  449. m_nSendCount += AssembByte(&m_SendBuffer[m_nSendCount], LOBYTE(Ram.Current_DiDoConfig.DiConfig[nID] ));
  450. }
  451. }
  452. //读常开常闭配置
  453. static void ProcessC2ReadDiNoNcCfg(void)
  454. {
  455. int nID;
  456. m_nSendCount = 0;
  457. for (nID=0; nID<DI_REALCOUNT; nID++)
  458. {
  459. //开入常开常闭
  460. m_nSendCount += AssembByte(&m_SendBuffer[m_nSendCount], !!Ram.Current_DiDoConfig.DiOpenOrClose[nID] );
  461. }
  462. }
  463. //读开出配置
  464. static void ProcessC2ReadDoCfg(void)
  465. {
  466. int nID;
  467. m_nSendCount = 0;
  468. for (nID=0; nID<NUM_REAL_DO_COUNT; nID++)
  469. {
  470. //关联的虚拟ID
  471. m_nSendCount += AssembByte(&m_SendBuffer[m_nSendCount], LOBYTE( Ram.Current_DiDoConfig.DoConfig[nID] ));
  472. }
  473. }
  474. //读用户密码
  475. static void ProcessC2ReadUserPw(void)
  476. {
  477. int16 nVal = GetSysCfgValue(ID_SYS_PASSWORD);
  478. m_nSendCount = 0;
  479. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount], nVal);
  480. }
  481. //读语言
  482. static void ProcessC2ReadUserLang(void)
  483. {
  484. int16 nVal = GetSysCfgValue(ID_SYS_LANGUAGE);
  485. m_nSendCount = 0;
  486. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount], nVal);
  487. }
  488. //读取实际测量值,浮点数格式送外部系统
  489. static fp32 _GetMeasFP32Value(int nMeasureID)
  490. {
  491. int32 iVal;
  492. fp32 fVal=0;
  493. fp32 fK = 1.0;
  494. const TMeasureDefine * pDef = &MeasDefine[nMeasureID];
  495. //1. 有些测量值特殊处理,比如功率,电能需要合并成一个数值
  496. if(nMeasureID == MEAS_MEAS_P_L || 
  497. nMeasureID == MEAS_MEAS_Q_L ||
  498. nMeasureID == MEAS_MEAS_S_L ||
  499. nMeasureID == MEAS_MEAS_Pa_L   ||
  500. nMeasureID == MEAS_MEAS_Qa_L || 
  501. nMeasureID == MEAS_MEAS_Sa_L ||
  502. nMeasureID == MEAS_MEAS_Pb_L ||
  503. nMeasureID == MEAS_MEAS_Qb_L || 
  504. nMeasureID == MEAS_MEAS_Sb_L ||
  505. nMeasureID == MEAS_MEAS_Pc_L ||
  506. nMeasureID == MEAS_MEAS_Qc_L || 
  507. nMeasureID == MEAS_MEAS_Sc_L ||
  508. nMeasureID == MEAS_PE_L||
  509. nMeasureID == MEAS_QE_L||
  510. nMeasureID == MEAS_PEa_L||
  511. nMeasureID == MEAS_QEa_L||
  512. nMeasureID == MEAS_PEb_L||
  513. nMeasureID == MEAS_QEb_L||
  514. nMeasureID == MEAS_PEc_L||
  515. nMeasureID == MEAS_QEc_L)
  516. {
  517. iVal = MAKEDWORD(Ram.CurrentMeasure.Arr[nMeasureID], 
  518. Ram.CurrentMeasure.Arr[nMeasureID+1]);
  519. }
  520. else
  521. {
  522. iVal = Ram.CurrentMeasure.Arr[nMeasureID];
  523. }
  524. //2. 需要将数值转换成实际数值显示
  525. switch(pDef->Character) {
  526. case MEAS_CHARACTER_I: //电流型数据
  527. {
  528. if (pDef->uTypeID==ID_STRING_MEASTYPE_MEAS)
  529. {
  530. fK = 0.001*GetDeviceModelValue(ID_DEVICEMODEL_CT_SECONDARYIE)/10 *GetSysCfgValue(ID_SYS_CT_SCALE)/ 10;  // 增加CT变比  升级
  531. else
  532. {
  533. fK = 0.001*GetDeviceModelValue(ID_DEVICEMODEL_CT_SECONDARYIE)/10 ;  //增加CT变比  升级
  534. }
  535. }
  536. break;
  537. case MEAS_CHARACTER_U:    //电压型数据
  538. {
  539. if (pDef->uTypeID==ID_STRING_MEASTYPE_MEAS)
  540. {
  541. fK = 0.001 * GetSysCfgValue(ID_SYS_PT_SCALE) *  GetDeviceModelValue(ID_DEVICEMODEL_PT_SECONDARYUE) /1732 ;
  542. }
  543. else
  544. {
  545. fK = 0.001 * GetDeviceModelValue(ID_DEVICEMODEL_PT_SECONDARYUE)*10 /1732 ;
  546. }
  547. }
  548. break;
  549. case MEAS_CHARACTER_UL: //线电压数据
  550. {
  551. if (pDef->uTypeID==ID_STRING_MEASTYPE_MEAS)
  552. {
  553. fK = 0.001 * GetSysCfgValue(ID_SYS_PT_SCALE) *  GetDeviceModelValue(ID_DEVICEMODEL_PT_SECONDARYUE) / 1000 ;
  554. }
  555. else
  556. {
  557. fK = 0.001 *  GetDeviceModelValue(ID_DEVICEMODEL_PT_SECONDARYUE) / 100 ;
  558. }
  559. }
  560. break ;
  561. case MEAS_CHARACTER_I0:       //零序型数据
  562. {
  563. if (GetDeviceModelValue(ID_DEVICEMODEL_MODEL_L)==MODEL_HAVEI0)
  564. {
  565. fK = 0.001 * GetDeviceModelValue(ID_DEVICEMODEL_SECONDARYI0)/10;
  566. }
  567. else
  568. {
  569. fK = 0.001 * GetDeviceModelValue(ID_DEVICEMODEL_CT_SECONDARYIE)/10 ;
  570. }
  571. }
  572. break;
  573. default:   //其他类型
  574. {
  575. //电能信息
  576. fK   = 1.0 / TEN_MULTIPLE(pDef->point);
  577. }
  578. }
  579. //转换成浮点数格式
  580. fVal = fK * iVal; //转为浮点数
  581. return fVal;
  582. }
  583. //读上送测值实际值
  584. static void ProcessC2ReadMeas(int nFolderID)
  585. {
  586. fp32 fVal;
  587. int nMeasureID;
  588. int nTmpCounter=0;
  589. //找到测量页的起始ID号
  590. for (nMeasureID=0; nMeasureID<NUM_MEASURES; nMeasureID++)
  591. {
  592. nTmpCounter++;
  593. if(nMeasureID == MEAS_MEAS_P_L || 
  594. nMeasureID == MEAS_MEAS_Q_L ||
  595. nMeasureID == MEAS_MEAS_S_L ||
  596. nMeasureID == MEAS_MEAS_Pa_L   ||
  597. nMeasureID == MEAS_MEAS_Qa_L || 
  598. nMeasureID == MEAS_MEAS_Sa_L ||
  599. nMeasureID == MEAS_MEAS_Pb_L ||
  600. nMeasureID == MEAS_MEAS_Qb_L || 
  601. nMeasureID == MEAS_MEAS_Sb_L ||
  602. nMeasureID == MEAS_MEAS_Pc_L ||
  603. nMeasureID == MEAS_MEAS_Qc_L || 
  604. nMeasureID == MEAS_MEAS_Sc_L ||
  605. nMeasureID == MEAS_PE_L||
  606. nMeasureID == MEAS_QE_L||
  607. nMeasureID == MEAS_PEa_L||
  608. nMeasureID == MEAS_QEa_L||
  609. nMeasureID == MEAS_PEb_L||
  610. nMeasureID == MEAS_QEb_L||
  611. nMeasureID == MEAS_PEc_L||
  612. nMeasureID == MEAS_QEc_L)
  613. {
  614. nMeasureID++; //跳过高WORD
  615. continue ;
  616. }
  617. if(nTmpCounter > 50*nFolderID)
  618. break ;
  619. }
  620. nTmpCounter = 0;
  621. m_nSendCount = 0;
  622. for ( ;nMeasureID<NUM_MEASURES; nMeasureID++)
  623. {
  624. nTmpCounter++;
  625. if(nTmpCounter > 50) //每页50个
  626. break ;
  627. fVal = _GetMeasFP32Value(nMeasureID);
  628. m_nSendCount += AssembDWordBigEdin(&m_SendBuffer[m_nSendCount], BIT_CONVERT_FP32_TO_UINT32(fVal));
  629. if(nMeasureID == MEAS_MEAS_P_L || 
  630. nMeasureID == MEAS_MEAS_Q_L ||
  631. nMeasureID == MEAS_MEAS_S_L ||
  632. nMeasureID == MEAS_MEAS_Pa_L   ||
  633. nMeasureID == MEAS_MEAS_Qa_L || 
  634. nMeasureID == MEAS_MEAS_Sa_L ||
  635. nMeasureID == MEAS_MEAS_Pb_L ||
  636. nMeasureID == MEAS_MEAS_Qb_L || 
  637. nMeasureID == MEAS_MEAS_Sb_L ||
  638. nMeasureID == MEAS_MEAS_Pc_L ||
  639. nMeasureID == MEAS_MEAS_Qc_L || 
  640. nMeasureID == MEAS_MEAS_Sc_L ||
  641. nMeasureID == MEAS_PE_L||
  642. nMeasureID == MEAS_QE_L||
  643. nMeasureID == MEAS_PEa_L||
  644. nMeasureID == MEAS_QEa_L||
  645. nMeasureID == MEAS_PEb_L||
  646. nMeasureID == MEAS_QEb_L||
  647. nMeasureID == MEAS_PEc_L||
  648. nMeasureID == MEAS_QEc_L)
  649. {
  650. nMeasureID++; //跳过高WORD
  651. }
  652. }
  653. }
  654. //读调试数据
  655. static void ProcessC2ReadDebugData(int nFolderID)
  656. {
  657. //暂无调试数据
  658. }
  659. //读趋势图及棒图的测量值
  660. static void ProcessC2ReadCommuMeas(int bTrendView)
  661. {
  662. fp32 fVal;
  663. int i;
  664. unsigned char sendMeasID[]={
  665. MEAS_MEAS_Ia,
  666. MEAS_MEAS_Ib,
  667. MEAS_MEAS_Ic,
  668. MEAS_MEAS_Ua, //Ua
  669. MEAS_MEAS_Ub, //Ub
  670. MEAS_MEAS_Uc, //Uc
  671. MEAS_MEAS_Uab,
  672. MEAS_MEAS_Ubc,
  673. MEAS_MEAS_Uca,
  674. MEAS_MEAS_P_L,
  675. MEAS_MEAS_Q_L,
  676. MEAS_MEAS_S_L,
  677. MEAS_MEAS_FACT,
  678. MEAS_F,
  679. };
  680. unsigned char nCount = sizeof(sendMeasID)/sizeof(unsigned char);
  681. //通讯上送的量与组态工具设置的要一致
  682. m_nSendCount = 0;
  683. for (i=0; i<nCount; i++)
  684. {
  685. fVal = _GetMeasFP32Value(sendMeasID[i]);
  686. m_nSendCount += AssembDWordBigEdin(&m_SendBuffer[m_nSendCount], BIT_CONVERT_FP32_TO_UINT32(fVal));
  687. }
  688. }
  689. //读开入值
  690. static void ProcessC2ReadDiData(void)
  691. {
  692. int i;
  693. m_nSendCount = 0;
  694. for (i=0; i<DI_REALCOUNT; i++)
  695. {
  696. m_nSendCount += AssembByte(&m_SendBuffer[m_nSendCount], GetRealDigiIn(i) );
  697. }
  698. }
  699. //读开出值
  700. static void ProcessC2ReadDoData(void)
  701. {
  702. int i;
  703. m_nSendCount = 0;
  704. for (i=0; i<NUM_REAL_DO_COUNT; i++)
  705. {
  706. m_nSendCount += AssembByte(&m_SendBuffer[m_nSendCount], GetRealDigiOut(i) );
  707. }
  708. }
  709. //读虚拟点值
  710. static void ProcessC2ReadPtData(void)
  711. {
  712. int i;
  713. m_nSendCount = 0;
  714. for (i=0; i<0; i++)
  715. {
  716. m_nSendCount += AssembByte(&m_SendBuffer[m_nSendCount], 0 );
  717. }
  718. }
  719. //读软压板值
  720. static void ProcessC2ReadSoftStrap(void)
  721. {
  722. int i;
  723. m_nSendCount = 0;
  724. for (i=0; i<0; i++)
  725. {
  726. m_nSendCount += AssembByte(&m_SendBuffer[m_nSendCount], 0 );
  727. }
  728. }
  729. //读异常信号值
  730. static void ProcessC2ReadAbnlSignal(void)
  731. {
  732. int i;
  733. m_nSendCount = 0;
  734. for ( i=0; i<NUM_ABNORMAL_COUNT; i++)
  735. {
  736. m_nSendCount += AssembByte(&m_SendBuffer[m_nSendCount],  IsAbnormal(i) );
  737. }
  738. }
  739. //读动作信号值
  740. static void ProcessC2ReadActSignal(void)
  741. {
  742.     int i;
  743. m_nSendCount = 0;
  744. for ( i=0; i<NUM_PROT_ACTION_COUNT; i++)
  745. {
  746. m_nSendCount += AssembByte(&m_SendBuffer[m_nSendCount],  GetProtActionSignal(i) );
  747. }
  748. }
  749. //读电能信息
  750. static void ProcessC2ReadEgyInfo(void)
  751. {
  752. fp32 fValue;
  753. m_nSendCount = 0;
  754. fValue = 1.0*Ram.TotalEnergy.PE/100;
  755. m_nSendCount += AssembDWordBigEdin(&m_SendBuffer[m_nSendCount], BIT_CONVERT_FP32_TO_UINT32(fValue));
  756. fValue = 1.0*Ram.TotalEnergy.QE/100;
  757. m_nSendCount += AssembDWordBigEdin(&m_SendBuffer[m_nSendCount], BIT_CONVERT_FP32_TO_UINT32(fValue));
  758. }
  759. //读统计信息
  760. static void ProcessC2ReadStatInfo(void)
  761. {
  762. int i;
  763. fp32 fValue;
  764. const TMeasureDefine* pMeasDef;
  765. m_nSendCount = 0;
  766. for (i=0; i<NUM_STATISTICS; i++)
  767. {
  768. pMeasDef = &StatisticDefine[i];
  769. fValue = 1.0*Ram.Eeprom.save.Statistic.Arr[i]/TEN_MULTIPLE(pMeasDef->point);
  770. m_nSendCount += AssembDWordBigEdin(&m_SendBuffer[m_nSendCount], BIT_CONVERT_FP32_TO_UINT32(fValue));
  771. }
  772. }
  773. //读Profibus当前和1类主站信息
  774. static void ProcessC2ReadProfibusStatInfo(void)
  775. {
  776. #define __WAIT_PRM                        ( ( uint8)0x00)
  777. #define __WAIT_CFG                        ( ( uint8)0x10)
  778. #define __DATA_EX                         ( ( uint8)0x20)
  779. #define __DP_ERROR                        ( ( uint8)0x30)
  780.     uint8 nBaudRate=255;
  781. uint8 nDPStat=__WAIT_PRM;
  782. uint8 nMasterAddr=0;
  783. uint8 bDPV1=0;
  784. uint32 nPrmCount=0;
  785. uint32 nChkCfgCount=0;
  786. //通讯状态
  787. nBaudRate = GetProfibusBaudRate(0);
  788. nDPStat = GetProfibusDPState(0);
  789. nMasterAddr = vpc3_get_master(0);
  790. m_nSendCount = 0;
  791. if (nBaudRate > 9)
  792. {
  793. nBaudRate = 255;
  794. }
  795. switch(nDPStat)
  796. {
  797. case __WAIT_PRM:
  798. nDPStat = 0;
  799. break;
  800. case __WAIT_CFG:
  801. nDPStat = 1;
  802. break;
  803. case __DATA_EX:
  804. nDPStat = 2;
  805. break;
  806. case __DP_ERROR:
  807. nDPStat = 3;
  808. break;
  809. default:
  810. nDPStat = 4;
  811. break;
  812. }
  813. //波特率
  814. m_nSendCount += AssembByte(&m_SendBuffer[m_nSendCount],  nBaudRate );
  815.     //DP状态
  816. m_nSendCount += AssembByte(&m_SendBuffer[m_nSendCount],  nDPStat );
  817. //主站地址
  818. m_nSendCount += AssembByte(&m_SendBuffer[m_nSendCount],  nMasterAddr );
  819. //DPV1 是否启用
  820. m_nSendCount += AssembByte(&m_SendBuffer[m_nSendCount],  bDPV1 );
  821. //参数化次数
  822. //检查配置次数
  823. m_nSendCount += AssembDWordBigEdin(&m_SendBuffer[m_nSendCount], nPrmCount);
  824. //检查配置次数
  825. m_nSendCount += AssembDWordBigEdin(&m_SendBuffer[m_nSendCount], nChkCfgCount);
  826. }
  827. enum{
  828. SOE_ACTION___, /*!< 保护动作事件 */
  829. SOE_WARNING___, /*!< 保护告警事件 */
  830. SOE_DIEVENT___, /*!< 开入变位事件 */
  831. SOE_ABNORMAL___, /*!< 异常事件 */
  832. SOE_DOEVENT___, /*!< 开出变位事件 */
  833. SOE_RUN___, /*!< 运行事件 */
  834. SOE_CONTROL___, /*!< 控制事件 */
  835. SOE_INFO___, /*!< 信息事件-没有事件编号,事件信息就是字符串,可以附加测值 */
  836. SOE_CUSTOM1___, /*!< 自定义事件1 */
  837. SOE_CUSTOM2___, /*!< 自定义事件2 */
  838. SOE_CUSTOM3___, /*!< 自定义事件3 */
  839. SOE_CUSTOM4___, /*!< 自定义事件4 */
  840. SOE_WAVE_FILE___, //录波文件数量
  841. SOE_TRACE___, /*!< 调试信息 */
  842. SOE_OPERATE___, //操作报告
  843. SOE_TYPE_COUNT ///< SOE类型
  844. };
  845. //格式化时间信息
  846. static const char * str_GetDateTimeString(const TDateTime * pDateTime, char *pCh)
  847. {
  848. sprintf(pCh, "%04u-%02u-%02u %02u:%02u:%02u.%03u", pDateTime->y+2000, pDateTime->mon,
  849. pDateTime->d,pDateTime->h,pDateTime->min,pDateTime->s,pDateTime->ms);
  850. return pCh;
  851. }
  852. //格式化测量值显示
  853. static const char* str_GetMeasValueString(int nMeasID)
  854. {
  855. static char szBuffer[32];
  856. char ch[8];
  857. const TMeasureDefine* pMeasDef = &MeasDefine[nMeasID];
  858. fp32 fValue= _GetMeasFP32Value(nMeasID);
  859. sprintf(ch,"%%.%df",pMeasDef->point);
  860. sprintf(szBuffer, ch, fValue);
  861. return szBuffer;
  862. }
  863. //取指定序号动作报告
  864. static const TActionSOE * soe_GetActionSOE(int index)
  865. {
  866. int count = soe_GetActionSOECount();
  867. if(index > count || index <0)
  868. {
  869. return NULL; //无报告
  870. }
  871. else
  872. {
  873. index = soe_GetActionSOESerialNumber(index)%NUM_ACTIONSOE; //报文所在位置
  874. return &ExramSOESave.SOESave.ActionSOESave.soe[index];
  875. }
  876. }
  877. //取指定序号开入报告
  878. static const TDigitalSOE * soe_GetDiEventSOE(int index)
  879. {
  880. int count = soe_GetDigitalSOECount();
  881. if(index > count || index <0)
  882. {
  883. return NULL; //无报告
  884. }
  885. else
  886. {
  887. index = soe_GetDigitalSOESerialNumber(index)%NUM_DIGITALSOE; //报文所在位置
  888. return &ExramSOESave.SOESave.DigitalSOESave.soe[index];
  889. }
  890. }
  891. //取指定序号异常报告
  892. static const TAbnormalSOE * soe_GetAbnormalSOE(int index)
  893. {
  894. int count = soe_GetAbnormalSOECount();
  895. if(index > count || index <0)
  896. {
  897. return NULL; //无报告
  898. }
  899. else
  900. {
  901. index = soe_GetAbnormalSOESerialNumber(index)%NUM_ABNORMALSOE; //报文所在位置
  902. return &ExramSOESave.SOESave.AbnormalSOESave.soe[index];
  903. }
  904. }
  905. //取指定序号运行报告
  906. static const TRunSOE * soe_GetRunSOE(int index)
  907. {
  908. int count = soe_GetRunSOECount();
  909. if(index > count || index <0)
  910. {
  911. return NULL; //无报告
  912. }
  913. else
  914. {
  915. index = soe_GetRunSOESerialNumber(index)%NUM_RUNSOE; //报文所在位置
  916. return &ExramSOESave.SOESave.RunSOESave.soe[index];
  917. }
  918. }
  919. //取指定序号控制报告
  920. static const TControlSOE* soe_GetControlSOE(int index)
  921. {
  922. int count = soe_GetControlSOECount();
  923. if(index > count || index <0)
  924. {
  925. return NULL; //无报告
  926. }
  927. else
  928. {
  929. index = soe_GetControlSOESerialNumber(index)%NUM_CONTROLSOE; //报文所在位置
  930. return &ExramSOESave.SOESave.ControlSOESave.soe[index];
  931. }
  932. }
  933. //读取SOE事件
  934. static int ProcessC2ReadSoe(uint8 nIndex, uint8* nErrCode1, uint8* nErrCode2)
  935. {
  936. // PDM侧读取事件方式:
  937. //  0. PDM先发送写命令下发要读取的事件类型保存在m_nSoeType
  938. // 1. PDM然后读取该类型的报文个数( 240+事件类型用于读取指定类型报告的个数)
  939. //  2. PDM然后读取每条报告中各个子报告项信息
  940. int nRetCode = 0;//DPV1_OK
  941. //然后判断读取指定类型的信息命令
  942. const TMeasureDefine * pMeasDef;
  943. const TActionSOE * pActionSOE;
  944. const TDigitalSOE * pDiEventSOE;
  945. const TAbnormalSOE * pAbnormalSOE;
  946. const TRunSOE * pRunSOE;
  947. const TControlSOE * pControlSOE;
  948.   // const TTraceSOE * pTraceSOE;
  949.     //const TMotorSOE* pMotorSOE;
  950. char szBuffer[40];
  951. // char szValue[40];
  952. int idTmp;
  953. int nMaxMeasID;
  954. int ii;
  955. m_nSendCount = 0;
  956. //先判断获取SOE个数的index
  957. switch(nIndex)
  958. {
  959. case 240 + SOE_ACTION___:
  960. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount],  soe_GetActionSOECount() );
  961. break;
  962. case 240 + SOE_WARNING___:
  963. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount],  0 );
  964.     break;
  965. case 240 + SOE_DIEVENT___:
  966. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount],  soe_GetDigitalSOECount() );
  967.     break;
  968. case 240 + SOE_ABNORMAL___:
  969. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount],  soe_GetAbnormalSOECount() );
  970.     break;
  971. case 240 + SOE_DOEVENT___:
  972. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount],  0 );
  973.     break;
  974. case 240 + SOE_RUN___:
  975. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount],  soe_GetRunSOECount() );
  976.     break;
  977. case 240 + SOE_CONTROL___:
  978. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount],  soe_GetControlSOECount() );
  979.     break;
  980. case 240 + SOE_INFO___:
  981. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount],  0 );
  982.     break;
  983. case 240 + SOE_CUSTOM1___://不支持
  984. case 240 + SOE_CUSTOM2___:
  985. case 240 + SOE_CUSTOM3___:
  986. case 240 + SOE_CUSTOM4___:
  987. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount],  0 );
  988.     break;
  989. case 240 + SOE_WAVE_FILE___:
  990. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount],  0 );
  991.     break;
  992. case 240 + SOE_OPERATE___:
  993. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount],  0 );
  994.     break;
  995. case 240 + SOE_TRACE___:
  996. m_nSendCount += AssembWordBigEdin(&m_SendBuffer[m_nSendCount],  soe_GetTraceSOECount() );
  997.     break;
  998. default:
  999. nRetCode = 0x81;//DPV1_NOK
  1000. *nErrCode1 = 0xB0;//DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_INDEX;
  1001. *nErrCode2 = 0xff;
  1002. break;
  1003. }
  1004. if(nIndex > 240)
  1005. return nRetCode;
  1006. switch(m_nSoeType)
  1007. {
  1008. case SOE_ACTION___:
  1009. {
  1010. pActionSOE = soe_GetActionSOE(m_nSoeIndex+1);
  1011. if (pActionSOE)
  1012. {
  1013. if (nIndex == 0)
  1014. {
  1015. //时间
  1016. str_GetDateTimeString(&pActionSOE->time, szBuffer);
  1017. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1018. //事件类型
  1019. strcpy(szBuffer, g_strAction[pActionSOE->type-ID_SET_PROTTYPE].strArr[CURRENT_LANG]);
  1020. strcat(szBuffer, " ");
  1021. //动作结果
  1022. strcat(szBuffer, g_strUtility[pActionSOE->result + ID_UTILITY_ACT_RESULT_SUCCESS].strArr[CURRENT_LANG] );
  1023. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1024. }
  1025. else
  1026. {
  1027. //动作测量量
  1028. nMaxMeasID = NUM_MEASINSOE;
  1029. for (ii=0; ii<NUM_MEASINSOE; ii++)
  1030. {
  1031. if (pActionSOE->measure.Meas[ii].MeasType == MEAS_NONE)
  1032. {
  1033. nMaxMeasID = ii;
  1034. break;
  1035. }
  1036. }
  1037. //故障测量值
  1038. if(nIndex<=nMaxMeasID && pActionSOE->measure.Meas[nIndex-1].MeasType != MEAS_NONE)
  1039. {
  1040. idTmp = pActionSOE->measure.Meas[nIndex-1].MeasType; //测值ID
  1041. pMeasDef = &MeasDefine[idTmp];
  1042. sprintf(szBuffer, "%s=%s %s", pMeasDef->pName, 
  1043. str_GetMeasValueString(idTmp),
  1044. pMeasDef->unit);
  1045. //故障测量值信息
  1046. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1047. }
  1048. else
  1049. {
  1050. nRetCode = 0x81;//DPV1_NOK
  1051. *nErrCode1 = 0xB7;//DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  1052. *nErrCode2 = 0xff;
  1053. }
  1054. }
  1055. }
  1056. else
  1057. {
  1058. memset(szBuffer, 0, 40);
  1059. if(nIndex == 0)
  1060. {
  1061. //时间
  1062. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1063. //事件类型
  1064. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1065. }
  1066. else
  1067. {
  1068. nRetCode = 0x81;//DPV1_NOK
  1069. *nErrCode1 = 0xB7;//DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  1070. *nErrCode2 = 0xff;
  1071. }
  1072. }
  1073. }
  1074. break;
  1075. case SOE_DIEVENT___:
  1076. {
  1077. pDiEventSOE = soe_GetDiEventSOE(m_nSoeIndex+1);
  1078. if (pDiEventSOE)
  1079. {
  1080. if(nIndex == 0)
  1081. {
  1082. //时间
  1083. str_GetDateTimeString(&pDiEventSOE->time, szBuffer);
  1084. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1085. //事件类型
  1086. sprintf(szBuffer, str_GetRealDiNameString(pDiEventSOE->di)); //物理名称
  1087. strcat(szBuffer, " ");
  1088. //变位类型
  1089. if(pDiEventSOE->state == DI_OFF)
  1090. strcat(szBuffer, "1->0 ");
  1091. else
  1092. strcat(szBuffer, "0->1 ");
  1093. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1094. }
  1095. else
  1096. {
  1097. nRetCode = 0x81;//DPV1_NOK
  1098. *nErrCode1 = 0xB7;//DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  1099. *nErrCode2 = 0xff;
  1100. }
  1101. }
  1102. else
  1103. {
  1104. memset(szBuffer, 0, 40);
  1105. if(nIndex == 0)
  1106. {
  1107. //时间
  1108. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1109. //事件类型
  1110. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1111. }
  1112. else
  1113. {
  1114. nRetCode = 0x81;//DPV1_NOK
  1115. *nErrCode1 = 0xB7;//DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  1116. *nErrCode2 = 0xff;
  1117. }
  1118. }
  1119. }
  1120. break;
  1121. case SOE_ABNORMAL___:
  1122. {
  1123. pAbnormalSOE = soe_GetAbnormalSOE(m_nSoeIndex+1);
  1124. if (pAbnormalSOE != NULL)
  1125. {
  1126. if(nIndex == 0)
  1127. {
  1128. //时间
  1129. str_GetDateTimeString(&pAbnormalSOE->time, szBuffer);
  1130. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1131. //事件类型
  1132. sprintf(szBuffer, g_strAbnormal[pAbnormalSOE->type-ABNORMAL_FIRST].strArr[CURRENT_LANG] );
  1133. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1134. }
  1135. else
  1136. {
  1137. nRetCode = 0x81;//DPV1_NOK
  1138. *nErrCode1 = 0xB7;//DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  1139. *nErrCode2 = 0xff;
  1140. }
  1141. }
  1142. else
  1143. {
  1144. memset(szBuffer, 0, 40);
  1145. if(nIndex == 0)
  1146. {
  1147. //时间
  1148. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1149. //事件类型
  1150. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1151. }
  1152. else
  1153. {
  1154. nRetCode = 0x81;//DPV1_NOK
  1155. *nErrCode1 = 0xB7;//DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  1156. *nErrCode2 = 0xff;
  1157. }
  1158. }
  1159. }
  1160.     break;
  1161. case SOE_RUN___:
  1162. {
  1163. pRunSOE = soe_GetRunSOE(m_nSoeIndex+1);
  1164. if (pRunSOE != NULL)
  1165. {
  1166. if(nIndex == 0)
  1167. {
  1168. //时间
  1169. str_GetDateTimeString(&pRunSOE->time, szBuffer);
  1170. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1171. //事件类型
  1172. sprintf(szBuffer, g_strRun[pRunSOE->type-RUN_COOL_STARTUP].strArr[CURRENT_LANG] );
  1173. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1174. }
  1175. else
  1176. {
  1177. nRetCode = 0x81;//DPV1_NOK
  1178. *nErrCode1 = 0xB7;//DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  1179. *nErrCode2 = 0xff;
  1180. }
  1181. }
  1182. else
  1183. {
  1184. memset(szBuffer, 0, 40);
  1185. if(nIndex == 0)
  1186. {
  1187. //时间
  1188. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1189. //事件类型
  1190. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1191. }
  1192. else
  1193. {
  1194. nRetCode = 0x81;//DPV1_NOK
  1195. *nErrCode1 = 0xB7;//DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  1196. *nErrCode2 = 0xff;
  1197. }
  1198. }
  1199. }
  1200.     break;
  1201. case SOE_CONTROL___:
  1202. {
  1203. pControlSOE = soe_GetControlSOE(m_nSoeIndex+1);
  1204. if (pControlSOE != NULL)
  1205. {
  1206. if(nIndex == 0)
  1207. {
  1208. //时间
  1209. str_GetDateTimeString(&pControlSOE->time, szBuffer);
  1210. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1211. //事件类型
  1212. sprintf(szBuffer, g_strControl[pControlSOE->type-CONTROL_FIRST].strArr[CURRENT_LANG] );
  1213. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1214. }
  1215. else
  1216. {
  1217. nRetCode = 0x81;//DPV1_NOK
  1218. *nErrCode1 = 0xB7;//DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  1219. *nErrCode2 = 0xff;
  1220. }
  1221. }
  1222. else
  1223. {
  1224. memset(szBuffer, 0, 40);
  1225. if(nIndex == 0)
  1226. {
  1227. //时间
  1228. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1229. //事件类型
  1230. m_nSendCount += AssembNBytes(&m_SendBuffer[m_nSendCount], (uint8*)szBuffer, 40 );
  1231. }
  1232. else
  1233. {
  1234. nRetCode = 0x81;//DPV1_NOK
  1235. *nErrCode1 = 0xB7;//DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  1236. *nErrCode2 = 0xff;
  1237. }
  1238. }
  1239. }
  1240.     break;
  1241. case SOE_TRACE___:
  1242. {
  1243. }
  1244.     break;
  1245. default:
  1246.     break;
  1247. }
  1248. return nRetCode;
  1249. }
  1250. //写工程配置
  1251. static int ProcessWriteDeviceModel(uint8 nWriteLen, uint8* pDataWrite, uint8* nErrCode1, uint8* nErrCode2)
  1252. {
  1253. //写工程配置
  1254. uint8 nCount = nWriteLen/2;//定值个数
  1255. uint8 tmpBuffer[120*3];//最多一次120个定值
  1256. uint16 nBufferLen = nCount*3; //ID + WORD 
  1257. int bOK = TRUE;
  1258. int id;
  1259. int nRet = DPV1_OK;
  1260. uint16 nValue;
  1261. uint8 nIndex = 0;//数值修改的Offset从0开始
  1262. if(nCount>0)
  1263. {
  1264. //检查
  1265. bOK = TRUE;
  1266. for (id=nIndex;id<(nIndex+nCount);id++)
  1267. {
  1268. if(id>=NUM_DEVICEMODELS)
  1269. {
  1270. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_INDEX;
  1271. *nErrCode2 = 0;
  1272. nRet = DPV1_NOK;
  1273. bOK = FALSE;
  1274. break;
  1275. }
  1276. DissembWordBigEdin(&pDataWrite[(id-nIndex)*2], &nValue);
  1277. if(!CheckDeviceModelValue(id, nValue))
  1278. {
  1279. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  1280. *nErrCode2 = 0;
  1281. nRet = DPV1_NOK;
  1282. bOK = FALSE;
  1283. break;
  1284. }
  1285. else
  1286. {
  1287. //组织修改缓存区
  1288. tmpBuffer[(id-nIndex)*3 + 0 ] = id;
  1289. tmpBuffer[(id-nIndex)*3 + 1 ] = LOBYTE(nValue);
  1290. tmpBuffer[(id-nIndex)*3 + 2 ] = HIBYTE(nValue);
  1291. }
  1292. }
  1293. if(bOK) //检查正确,开始修改
  1294. {
  1295. eepwri_ModifyDeviceModelsByComm(tmpBuffer, nBufferLen );
  1296. }
  1297. }
  1298. return nRet;
  1299. }
  1300. //写保护定值
  1301. static int ProcessWriteProtectSettings(uint8 nWriteLen, uint8* pDataWrite, uint8* nErrCode1, uint8* nErrCode2)
  1302. {
  1303. //写保护定值
  1304. uint8 nCount = nWriteLen/2;//定值个数
  1305. uint8 tmpBuffer[120*3];//最多一次120个定值
  1306. uint16 nBufferLen = nCount*3; //ID + WORD 
  1307. int bOK = TRUE;
  1308. int id;
  1309. int nRet = DPV1_OK;
  1310. uint16 nValue;
  1311. uint8 nIndex = 0;//数值修改的Offset从0开始
  1312. if(nCount>0)
  1313. {
  1314. //检查
  1315. bOK = TRUE;
  1316. for (id=nIndex;id<(nIndex+nCount);id++)
  1317. {
  1318. if(id>=NUM_SETTINGS)
  1319. {
  1320. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_INDEX;
  1321. *nErrCode2 = 0;
  1322. nRet = DPV1_NOK;
  1323. bOK = FALSE;
  1324. break;
  1325. }
  1326. DissembWordBigEdin(&pDataWrite[(id-nIndex)*2], &nValue);
  1327. if(!CheckSettingValue(id, nValue))
  1328. {
  1329. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  1330. *nErrCode2 = 0;
  1331. nRet = DPV1_NOK;
  1332. bOK = FALSE;
  1333. break;
  1334. }
  1335. else
  1336. {
  1337. //组织修改缓存区
  1338. tmpBuffer[(id-nIndex)*3 + 0 ] = id;
  1339. tmpBuffer[(id-nIndex)*3 + 1 ] = LOBYTE(nValue);
  1340. tmpBuffer[(id-nIndex)*3 + 2 ] = HIBYTE(nValue);
  1341. }
  1342. }
  1343. if(bOK) //检查正确,开始修改
  1344. {
  1345. eepwri_ModifySettingsByComm(tmpBuffer, nBufferLen );
  1346. }
  1347. }
  1348. return nRet;
  1349. }
  1350. //写开入配置
  1351. static int ProcessWriteDiCfg(uint8 nWriteLen, uint8* pDataWrite, uint8* nErrCode1, uint8* nErrCode2)
  1352. {
  1353. int nRet = DPV1_OK;
  1354. int i;
  1355. int nRealWriteLen = 0;
  1356. uint8 tmpBuffer[120*2];//最多一次120个定值
  1357. //允许可编程状态才能进行设置 
  1358. if (GetDeviceModelValue(ID_DEVICEMODEL_PROGRAMMABLE) == PROGRAMMABLE_ON)
  1359. {
  1360. for (i=0;i<min(nWriteLen, DI_REALCOUNT);i++)
  1361. {
  1362. //检查定值编号是否合法
  1363. if(i>=NUM_REAL_DI_COUNT || ((1<<i) & DI_MASK)==0) //id不在允许的可配置范围内
  1364. {
  1365. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_INDEX;
  1366. *nErrCode2 = ErrCode2_Write_DICFG;
  1367. nRet = DPV1_NOK;
  1368. return nRet;
  1369. }
  1370. //检查值是否在范围内
  1371. if(!CheckDiConfigValue(pDataWrite[i]&0xff))
  1372. {
  1373. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  1374. *nErrCode2 = ErrCode2_Write_DICFG;
  1375. nRet = DPV1_NOK;
  1376. return nRet;
  1377. }
  1378. //组织修改缓存区
  1379. tmpBuffer[i*2 + 0 ] = i;
  1380. tmpBuffer[i*2 + 1 ] = pDataWrite[i]&0xff;
  1381. nRealWriteLen += 2;
  1382. }
  1383. eepwri_ModifyDiConfigsByComm(tmpBuffer, nRealWriteLen);
  1384. }
  1385. else
  1386. {
  1387. *nErrCode1 = DPV1_ERRCL_APPLICATION | DPV1_ERRCL_APP_WRITE;
  1388. *nErrCode2 = ErrCode2_Write_DICFG;
  1389. nRet = DPV1_NOK;
  1390. }
  1391. return nRet;
  1392. }
  1393. //写开出配置
  1394. static int ProcessWriteDoCfg(uint8 nWriteLen, uint8* pDataWrite, uint8* nErrCode1, uint8* nErrCode2)
  1395. {
  1396. int nRet = DPV1_OK;
  1397. int i;
  1398. uint8 tmpBuffer[120*2];//最多一次120个定值
  1399. int nRealWriteLen = 0;
  1400. //允许可编程状态才能进行设置 
  1401. if (GetDeviceModelValue(ID_DEVICEMODEL_PROGRAMMABLE) == PROGRAMMABLE_ON)
  1402. {
  1403. for (i=0;i<min(nWriteLen, NUM_REAL_DO_COUNT);i++)
  1404. {
  1405. //检查定值编号是否合法
  1406. if(i>=NUM_REAL_DO_COUNT)
  1407. {
  1408. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_INDEX;
  1409. *nErrCode2 = ErrCode2_Write_DOCFG;
  1410. nRet = DPV1_NOK;
  1411. return nRet;
  1412. }
  1413. //检查值是否在范围内
  1414. if(!CheckDoConfigValue(pDataWrite[i]&0xff))
  1415. {
  1416. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  1417. *nErrCode2 = ErrCode2_Write_DOCFG;
  1418. nRet = DPV1_NOK;
  1419. return nRet;
  1420. }
  1421. //组织修改缓存区
  1422. tmpBuffer[i*2 + 0 ] = i;
  1423. tmpBuffer[i*2 + 1 ] = pDataWrite[i]&0xff;
  1424. nRealWriteLen+=2;
  1425. }
  1426. eepwri_ModifyDoConfigsByComm(tmpBuffer, nRealWriteLen);
  1427. }
  1428. else
  1429. {
  1430. *nErrCode1 = DPV1_ERRCL_APPLICATION | DPV1_ERRCL_APP_WRITE;
  1431. *nErrCode2 = ErrCode2_Write_DOCFG;
  1432. nRet = DPV1_NOK;
  1433. }
  1434. return nRet;
  1435. }
  1436. //写开入常开常闭配置
  1437. static int ProcessWriteDiNoNcCfg(uint8 nWriteLen, uint8* pDataWrite, uint8* nErrCode1, uint8* nErrCode2)
  1438. {
  1439. int nRet = DPV1_OK;
  1440. int i;
  1441. uint8 tmpBuffer[120*2];//最多一次120个定值
  1442. int nRealWriteLen = 0;
  1443. //允许可编程状态才能进行设置 
  1444. if (GetDeviceModelValue(ID_DEVICEMODEL_DIOPENORCLOSE)==PROGRAMMABLE_ON)
  1445. {
  1446. for (i=0;i<min(nWriteLen, DI_REALCOUNT);i++)
  1447. {
  1448. //检查定值编号是否合法
  1449. if(i>=NUM_REAL_DI_COUNT || ((1<<i) & DI_MASK)==0) //id不在允许的可配置范围内
  1450. {
  1451. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_INDEX;
  1452. *nErrCode2 = ErrCode2_Write_DINONCCFG;
  1453. nRet = DPV1_NOK;
  1454. return nRet;
  1455. }
  1456. //检查值是否在范围内
  1457. if(!CheckDiOpenOrCloseValue(pDataWrite[i]&0xff))
  1458. {
  1459. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  1460. *nErrCode2 = ErrCode2_Write_DINONCCFG;
  1461. nRet = DPV1_NOK;
  1462. return nRet;
  1463. }
  1464. //组织修改缓存区
  1465. tmpBuffer[i*2 + 0 ] = i;
  1466. tmpBuffer[i*2 + 1 ] = pDataWrite[i]&0xff;
  1467. nRealWriteLen+=2;
  1468. }
  1469. eepwri_ModifyDiOpenOrCloseByComm(tmpBuffer, nRealWriteLen);
  1470. }
  1471. else
  1472. {
  1473. *nErrCode1 = DPV1_ERRCL_APPLICATION | DPV1_ERRCL_APP_WRITE;
  1474. *nErrCode2 = ErrCode2_Write_DINONCCFG;
  1475. nRet = DPV1_NOK;
  1476. }
  1477. return nRet;
  1478. }
  1479. //处理遥控
  1480. static int ProcessRemoteCtrl(uint8 nCtrlObj, uint8 nCtrlType ,uint8* nErrCode1, uint8* nErrCode2)
  1481. {
  1482. int nRet = DPV1_OK;
  1483. uint16  info;
  1484. if(ProcessRemoteCtrlExec(nCtrlObj+1,nCtrlType+1, &info))
  1485. {
  1486. }
  1487. else
  1488. {
  1489. *nErrCode1 = DPV1_ERRCL_APPLICATION | DPV1_ERRCL_APP_WRITE;
  1490. *nErrCode2 = ErrCode2_Write_Control;
  1491. nRet = DPV1_NOK;
  1492. }
  1493. return nRet;
  1494. }
  1495. //处理写系统设置
  1496. static int ProcessWriteSysCfg(uint8 nWriteLen, uint8* pDataWrite, uint8* nErrCode1, uint8* nErrCode2)
  1497. {
  1498. //写系统设置
  1499. //注意系统设置只从ID_SYS_OUTPUTI1开始进行设置
  1500. uint8 nCount = nWriteLen/2;//定值个数
  1501. uint8 tmpBuffer[120*3];//最多一次120个定值
  1502. uint16 nBufferLen = nCount*3; //ID + WORD 
  1503. int bOK = TRUE;
  1504. int id;
  1505. int nRet = DPV1_OK;
  1506. uint16 nValue;
  1507. //只有一个写操作, 从4~20mA交流量输出1定义开始设置
  1508. uint8 nIndex = ID_SYS_OUTPUTI1;
  1509. if(nCount>0)
  1510. {
  1511. //检查
  1512. bOK = TRUE;
  1513. for (id=nIndex;id<(nIndex+nCount);id++)
  1514. {
  1515. if(id>=NUM_SYSCFGS)
  1516. {
  1517. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_INDEX;
  1518. *nErrCode2 = 0;
  1519. nRet = DPV1_NOK;
  1520. bOK = FALSE;
  1521. break;
  1522. }
  1523. DissembWordBigEdin(&pDataWrite[(id-nIndex)*2], &nValue);
  1524. if(!CheckSysCfgValue(id, nValue))
  1525. {
  1526. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_RANGE;
  1527. *nErrCode2 = 0;
  1528. nRet = DPV1_NOK;
  1529. bOK = FALSE;
  1530. break;
  1531. }
  1532. else
  1533. {
  1534. //组织修改缓存区
  1535. tmpBuffer[(id-nIndex)*3 + 0 ] = id;
  1536. tmpBuffer[(id-nIndex)*3 + 1 ] = LOBYTE(nValue);
  1537. tmpBuffer[(id-nIndex)*3 + 2 ] = HIBYTE(nValue);
  1538. }
  1539. }
  1540. if(bOK) //检查正确,开始修改
  1541. {
  1542. eepwri_ModifySysCfgsByComm(tmpBuffer, nBufferLen );
  1543. }
  1544. }
  1545. return nRet;
  1546. }
  1547. //处理启动录波
  1548. static int ProcessStartWaveRecord(uint8* nErrCode1, uint8* nErrCode2)
  1549. {
  1550. int nRet = DPV1_OK;
  1551. // if(GetCurrentControlLimit()==CONTROL_LMT_REMOTE)
  1552. {
  1553. if(!WaveFlag.RecordFlag)
  1554. {
  1555. WaveFlag.TestRemote=1;
  1556. if(GetSysCfgValue(ID_SYS_WAVETIME) >0)  
  1557. {
  1558. WaveFlag.WaveTestLen=GetSysCfgValue(ID_SYS_WAVETIME)*12;
  1559. }
  1560. else
  1561. {
  1562. WaveFlag.WaveTestLen=0;
  1563. }
  1564. }
  1565. else
  1566. {
  1567. *nErrCode1 = DPV1_ERRCL_APPLICATION | DPV1_ERRCL_APP_WRITE;
  1568. *nErrCode2 = 0;
  1569. nRet = DPV1_NOK;
  1570. }
  1571. }
  1572. //  else
  1573. //  {
  1574. //  *nErrCode1 = DPV1_ERRCL_APPLICATION | DPV1_ERRCL_APP_WRITE;
  1575. //  *nErrCode2 = 0;
  1576. //  nRet = DPV1_NOK;
  1577. //  }
  1578. return nRet;
  1579. }
  1580. //二类主站建立联接请求
  1581. void EDD_C2_InitiateReq(uint8 nDevID)
  1582. {
  1583. }
  1584. //二类主站联接断掉通知
  1585. void EDD_C2_AbortInd(uint8 nDevID)
  1586. {
  1587. }
  1588. int DPV1_ReadReq(uint8 nDevID, uint8 nSlot, uint8 nIndex, uint8 nReadLen, uint8** pDataRet, uint8* pLenAssemb, uint8* nErrCode1, uint8* nErrCode2)
  1589. {
  1590. int nRet = DPV1_OK;
  1591. *pDataRet = NULL;
  1592. *pLenAssemb = 0;
  1593. *nErrCode1 = 0x00;
  1594. *nErrCode2 = 0x00;
  1595. g_ProfibusRam.nDisConnTimer = 0;//有非周期读写(二类)也表示处于正常连接状态
  1596. switch(nSlot&0xff)
  1597. {
  1598. /************************************************************************/
  1599. /* 一类主站与公司主控通讯                                               */
  1600. /************************************************************************/
  1601. case SlotNum_Read_BhPara:
  1602. {
  1603. //低字节在前
  1604. nRet = ProcessC2ReadProtSettingsWiscom(nIndex, nReadLen, nErrCode1, nErrCode2);
  1605. }
  1606. break;
  1607. case SlotNum_Read_Energy:
  1608. {
  1609. //低字节在前
  1610. nRet = ProcessC1ReadEgyInfoWiscom(nIndex, nReadLen, nErrCode1, nErrCode2);
  1611. }
  1612. break;
  1613. case SlotNum_Read_WaveConfig:
  1614. {
  1615. //低字节在前
  1616. nRet = ProcessWaveCfgWiscom(nIndex);
  1617. }
  1618. break;
  1619. case SlotNum_Read_WaveData_File_Zone0:
  1620. case SlotNum_Read_WaveData_File_Zone1:
  1621. case SlotNum_Read_WaveData_File_Zone2:
  1622. case SlotNum_Read_WaveData_File_Zone3:
  1623. {
  1624. //不支持
  1625. *nErrCode1 = DPV1_ERRCL_APPLICATION | DPV1_ERRCL_APP_NOTSUPP;
  1626. *nErrCode2 = 0;
  1627. nRet = DPV1_NOK;
  1628. }
  1629. break;
  1630. case SlotNum_Read_WaveData_Sample_Zone0:
  1631. case SlotNum_Read_WaveData_Sample_Zone1:
  1632. case SlotNum_Read_WaveData_Sample_Zone2:
  1633. case SlotNum_Read_WaveData_Sample_Zone3:
  1634. case SlotNum_Read_WaveData_Sample_Zone4:
  1635. case SlotNum_Read_WaveData_Sample_Zone5:
  1636. {
  1637. //采样点方式,低字节在前
  1638. nRet = ProcessWaveDataWiscom(nSlot, nIndex, nErrCode1, nErrCode2);
  1639. }
  1640. break;
  1641. case SlotNum_Read_BhPara_Zone0:
  1642. case SlotNum_Read_BhPara_Zone1:
  1643. case SlotNum_Read_BhPara_Zone2:
  1644. case SlotNum_Read_BhPara_Zone3:
  1645. case SlotNum_Read_BhPara_Zone4:
  1646. case SlotNum_Read_BhPara_Zone5:
  1647. {
  1648. //不支持
  1649. *nErrCode1 = DPV1_ERRCL_APPLICATION | DPV1_ERRCL_APP_NOTSUPP;
  1650. *nErrCode2 = 0;
  1651. nRet = DPV1_NOK;
  1652. }
  1653.     break;
  1654. case SlotNum_Read_DeviceInfo:
  1655. {
  1656. //低字节在前
  1657. nRet = ProcessReadDeviceInfoWiscom();
  1658. }
  1659. break;
  1660. case SlotNum_Read_WaveData_Comtrade_Zone0:
  1661. case SlotNum_Read_WaveData_Comtrade_Zone1:
  1662. case SlotNum_Read_WaveData_Comtrade_Zone2:
  1663. case SlotNum_Read_WaveData_Comtrade_Zone3:
  1664. case SlotNum_Read_WaveData_Comtrade_Zone4:
  1665. case SlotNum_Read_WaveData_Comtrade_Zone5:
  1666. case SlotNum_Read_WaveData_Comtrade_Zone6:
  1667. case SlotNum_Read_WaveData_Comtrade_Zone7:
  1668. case SlotNum_Read_WaveData_Comtrade_Zone8:
  1669. {
  1670. //不支持
  1671. *nErrCode1 = DPV1_ERRCL_APPLICATION | DPV1_ERRCL_APP_NOTSUPP;
  1672. *nErrCode2 = 0;
  1673. nRet = DPV1_NOK;
  1674. }
  1675. break;
  1676. /************************************************************************/
  1677. /* 二类主站,与CP5611卡,软件西门子PDM管理软件, 高字节在前              */
  1678. /************************************************************************/
  1679. case SlotNum_50:
  1680. {
  1681. switch(nIndex)
  1682. {
  1683. case SlotNum_50_SYSINFO:
  1684. {
  1685. ProcessC2ReadSysInfo();
  1686. }
  1687. break;
  1688. case SlotNum_50_DEVMODEL:
  1689. {
  1690. ProcessC2ReadDeviceModel();
  1691. }
  1692.     break;
  1693. case SlotNum_50_SYSCFG:
  1694. {
  1695. ProcessC2ReadSysCfg();
  1696. }
  1697.     break;
  1698. case SlotNum_50_PROTSETTING:
  1699. {
  1700. ProcessC2ReadProtSettings();
  1701. }
  1702.     break;
  1703. case SlotNum_50_DICFG:
  1704. {
  1705. ProcessC2ReadDiCfg();
  1706. }
  1707.     break;
  1708. case SlotNum_50_DOCFG:
  1709. {
  1710. ProcessC2ReadDoCfg();
  1711. }
  1712.     break;
  1713. case SlotNum_50_PW:
  1714. {
  1715. ProcessC2ReadUserPw();
  1716. }
  1717. break;
  1718. case SlotNum_50_DI_NONC:
  1719. {
  1720. ProcessC2ReadDiNoNcCfg();
  1721. }
  1722. break;
  1723. case SlotNum_50_LANGUAGE:
  1724. {
  1725. ProcessC2ReadUserLang();
  1726. }
  1727. break ;
  1728. default:
  1729. {
  1730. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_INDEX;
  1731. *nErrCode2 = 0;
  1732. nRet = DPV1_NOK;
  1733. }
  1734.     break;
  1735. }
  1736. }
  1737. break;
  1738. case SlotNum_51:
  1739. {
  1740. switch(nIndex)
  1741. {
  1742. case SlotNum_51_MEASFOLDER0:
  1743. case SlotNum_51_MEASFOLDER1:
  1744. case SlotNum_51_MEASFOLDER2:
  1745. {
  1746. ProcessC2ReadMeas(nIndex);
  1747. }
  1748. break;
  1749. case SlotNum_51_MEAS_COMMUSEND_BARVAL:
  1750. case SlotNum_51_MEAS_COMMUSEND_TRENDVIEW:
  1751. {
  1752.                     ProcessC2ReadCommuMeas(nIndex==SlotNum_51_MEAS_COMMUSEND_TRENDVIEW);
  1753. }
  1754. break;
  1755. default:
  1756. {
  1757. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_INDEX;
  1758. *nErrCode2 = 0;
  1759. nRet = DPV1_NOK;
  1760. }
  1761.     break;
  1762. }
  1763. }
  1764. break;
  1765. case SlotNum_52:
  1766. {
  1767. switch(nIndex)
  1768. {
  1769. case SlotNum_52_DBGDATA_FOLDER0:
  1770. case SlotNum_52_DBGDATA_FOLDER1:
  1771. case SlotNum_52_DBGDATA_FOLDER2:
  1772. {
  1773.                     ProcessC2ReadDebugData(nIndex);
  1774. }
  1775. break;
  1776. default:
  1777. {
  1778. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_INDEX;
  1779. *nErrCode2 = 0;
  1780. nRet = DPV1_NOK;
  1781. }
  1782.     break;
  1783. }
  1784. }
  1785. break;
  1786. case SlotNum_53:
  1787. {
  1788. switch(nIndex)
  1789. {
  1790. case SlotNum_53_DI:
  1791. {
  1792. ProcessC2ReadDiData();
  1793. }
  1794. break;
  1795. case SlotNum_53_DO:
  1796. {
  1797. ProcessC2ReadDoData();
  1798. }
  1799.     break;
  1800. case SlotNum_53_PT:
  1801. {
  1802. ProcessC2ReadPtData();
  1803. }
  1804.     break;
  1805. case SlotNum_53_SOFTSTRAP:
  1806. {
  1807. ProcessC2ReadSoftStrap();
  1808. }
  1809.     break;
  1810. case SlotNum_53_ABNLSIG:
  1811. {
  1812. ProcessC2ReadAbnlSignal();
  1813. }
  1814.     break;
  1815. case SlotNum_53_ACTSIG:
  1816. {
  1817. ProcessC2ReadActSignal();
  1818. }
  1819.     break;
  1820. case SlotNum_53_ENERGY:
  1821. {
  1822. ProcessC2ReadEgyInfo();
  1823. }
  1824.     break;
  1825. case SlotNum_53_STAT:
  1826. {
  1827. ProcessC2ReadStatInfo();
  1828. }
  1829.     break;
  1830. case SlotNum_53_PBSTAT:
  1831. {
  1832. ProcessC2ReadProfibusStatInfo();
  1833. }
  1834. break;
  1835. default:
  1836. {
  1837. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_INDEX;
  1838. *nErrCode2 = 0;
  1839. nRet = DPV1_NOK;
  1840. }
  1841.     break;
  1842. }
  1843. }
  1844. break;
  1845. case SlotNum_54: //读取指定类型的SOE事件
  1846. {     
  1847. ProcessC2ReadSoe(nIndex, nErrCode1, nErrCode2);
  1848. }
  1849. break;
  1850. }
  1851. *pDataRet = m_SendBuffer;
  1852. *pLenAssemb = m_nSendCount&0xff;
  1853. return nRet;
  1854. }
  1855. int DPV1_WriteReq(uint8 nDevID, uint8 nSlot, uint8 nIndex, uint8 nWriteLen, uint8* pDataWrite, uint8* nErrCode1, uint8* nErrCode2)
  1856. {
  1857. int nRet = DPV1_OK;
  1858. uint16 nValue;
  1859. uint16 nInfo;
  1860. int nMaxLen;
  1861. TDateTime time;
  1862. *nErrCode1 = 0x00;
  1863. *nErrCode2 = 0x00;
  1864. g_ProfibusRam.nDisConnTimer = 0;//有非周期读写(二类)也表示处于正常连接状态
  1865. switch(nSlot)
  1866. {
  1867. case SlotNum_Write_BhPara:
  1868. {
  1869. //判断index是否在范围内
  1870. if(nIndex < NUM_SETTINGS)
  1871. {
  1872. nMaxLen = ( (nIndex*2+nWriteLen)>sizeof(TSettings) )?(sizeof(TSettings)-nIndex*2):nWriteLen;
  1873. //写定值, 与自己系统通讯,低字节在前
  1874. if(profi_ModifySettings(nIndex, pDataWrite, nMaxLen, FALSE, &nInfo))
  1875. {
  1876. }
  1877. else
  1878. {
  1879. *nErrCode1 = DPV1_ERRCL_APPLICATION | DPV1_ERRCL_APP_WRITE;
  1880. *nErrCode2 = 0;
  1881. nRet = DPV1_NOK;
  1882. }
  1883. }
  1884. else
  1885. {
  1886. *nErrCode1 = DPV1_ERRCL_APPLICATION | DPV1_ERRCL_APP_WRITE;
  1887. *nErrCode2 = 0;
  1888. nRet = DPV1_NOK;
  1889. }
  1890. }
  1891. break;
  1892. case SlotNum_Write_StartWave:
  1893. {
  1894. if(!WaveFlag.RecordFlag)
  1895. {
  1896. WaveFlag.TestRemote=1;
  1897. if(GetSysCfgValue(ID_SYS_WAVETIME) >0) 
  1898. {
  1899. WaveFlag.WaveTestLen=GetSysCfgValue(ID_SYS_WAVETIME)*12;
  1900. }
  1901. else
  1902. {
  1903. WaveFlag.WaveTestLen=0;
  1904. }
  1905. }
  1906. else
  1907. {
  1908. *nErrCode1 = DPV1_ERRCL_APPLICATION | DPV1_ERRCL_APP_WRITE;
  1909. *nErrCode2 = 0;
  1910. nRet = DPV1_NOK;
  1911. }
  1912. }
  1913. break;
  1914. case SlotNum_Write_ModifyTime:
  1915. {
  1916. if(nIndex==0)
  1917. {
  1918. if(nWriteLen==7)
  1919. {
  1920. //通讯校时,只较到秒
  1921. DissembWordLittleEdin(&pDataWrite[0], &nValue);
  1922. time.y    =   nValue%100; //年范围0~99 表示2000~2099
  1923. time.mon  =   pDataWrite[2] & 0xff;
  1924. time.d    =   pDataWrite[3] & 0xff;
  1925. time.h    =   pDataWrite[4] & 0xff;
  1926. time.min  =   pDataWrite[5] & 0xff;
  1927. time.s    =   pDataWrite[6] & 0xff;
  1928. time.ms   =   Now().ms;
  1929. //设置装置时间
  1930. if(SetDeviceSystemTime(&time)!=TRUE) //时间违法
  1931. {
  1932. *nErrCode1 = DPV1_ERRCL_APPLICATION | DPV1_ERRCL_APP_WRITE;
  1933. *nErrCode2 = 0;
  1934. nRet = DPV1_NOK;
  1935. }
  1936. }
  1937. else
  1938. {
  1939. *nErrCode1  = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_WRITE_LEN;
  1940. *nErrCode2 = 0;
  1941. nRet = DPV1_NOK;
  1942. }
  1943. }
  1944. else
  1945. {
  1946. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_INDEX;
  1947. *nErrCode2 = 0;
  1948. nRet = DPV1_NOK;
  1949. }
  1950. }
  1951. break;
  1952. case SlotNum_Write_CtrlSelect:
  1953. case SlotNum_Write_CtrlCancel:
  1954. {
  1955. //不支持真遥控
  1956. *nErrCode1 = DPV1_ERRCL_APPLICATION | DPV1_ERRCL_APP_WRITE;
  1957. *nErrCode2 = 0;
  1958. nRet = DPV1_NOK;
  1959. }
  1960. break ;
  1961. case SlotNum_Write_CtrlExecute:
  1962. {
  1963. //只有遥控执行
  1964. nRet = ProcessRemoteCtrl(nIndex, pDataWrite[0] & 0xff, nErrCode1, nErrCode2);
  1965. }
  1966. break;
  1967. case SlotNum_Write_ResetSignal:
  1968. {
  1969. SignalReset(RUN_RESET_COMM);
  1970. }
  1971. break;
  1972. case SlotNum_Write_BhPara_Zone0:
  1973. case SlotNum_Write_BhPara_Zone1:
  1974. case SlotNum_Write_BhPara_Zone2:
  1975. case SlotNum_Write_BhPara_Zone3:
  1976. case SlotNum_Write_BhPara_Zone4:
  1977. case SlotNum_Write_BhPara_Zone5:
  1978. {
  1979. *nErrCode1 = DPV1_ERRCL_APPLICATION | DPV1_ERRCL_APP_WRITE;
  1980. *nErrCode2 = 0;
  1981. nRet = DPV1_NOK;
  1982. }
  1983. break;
  1984. case SlotNum_50:
  1985. {
  1986. switch(nIndex)
  1987. {
  1988. case SlotNum_50_DEVMODEL:
  1989. {
  1990.     nRet = ProcessWriteDeviceModel(nWriteLen, pDataWrite, nErrCode1, nErrCode2);
  1991. }
  1992.     break;
  1993. case SlotNum_50_SYSCFG:
  1994. {
  1995. nRet = ProcessWriteSysCfg(nWriteLen, pDataWrite, nErrCode1, nErrCode2);
  1996. }
  1997.     break;
  1998. case SlotNum_50_PROTSETTING:
  1999. {
  2000. nRet = ProcessWriteProtectSettings(nWriteLen, pDataWrite, nErrCode1, nErrCode2);
  2001. }
  2002. break;
  2003.              //400V增加开入开出及开入常开常闭设置功能
  2004. case SlotNum_50_DICFG:
  2005. {
  2006. nRet = ProcessWriteDiCfg(nWriteLen, pDataWrite, nErrCode1, nErrCode2);
  2007. }
  2008. break;
  2009. case SlotNum_50_DOCFG:
  2010. {
  2011. nRet = ProcessWriteDoCfg(nWriteLen, pDataWrite, nErrCode1, nErrCode2);
  2012. }
  2013. break;
  2014. case SlotNum_50_DI_NONC:
  2015. {
  2016. nRet = ProcessWriteDiNoNcCfg(nWriteLen, pDataWrite, nErrCode1, nErrCode2);
  2017. }
  2018. break;
  2019. case SlotNum_50_PW:
  2020. {
  2021. DissembWordBigEdin(&pDataWrite[0], &nValue);
  2022. eepwri_SetSysCfg(0, nValue);
  2023. }
  2024. break;
  2025. case SlotNum_50_CTRLOBJ:
  2026. {
  2027. nRet = ProcessRemoteCtrl(pDataWrite[0] & 0xff, pDataWrite[1] & 0xff, nErrCode1, nErrCode2);
  2028. }
  2029. break;
  2030. case SlotNum_50_SOFTSTRAP:
  2031. {
  2032. //无
  2033. }
  2034. break;
  2035. case SlotNum_50_SIGNALRESET:
  2036. {
  2037. SignalReset(RUN_RESET_COMM);
  2038. }
  2039. break;
  2040. case SlotNum_50_STARTWAVE:
  2041. {
  2042. nRet = ProcessStartWaveRecord(nErrCode1, nErrCode2);
  2043. }
  2044. break;
  2045. case SlotNum_50_LANGUAGE:
  2046. {
  2047. DissembWordBigEdin(&pDataWrite[0], &nValue);
  2048. eepwri_SetSysCfg(ID_SYS_LANGUAGE, nValue);
  2049. }
  2050. break ;
  2051. default:
  2052. {
  2053. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_INDEX;
  2054. *nErrCode2 = 0;
  2055. nRet = DPV1_NOK;
  2056. }
  2057. break;
  2058. }
  2059. }
  2060. break;
  2061. case SlotNum_51:
  2062. case SlotNum_52:
  2063. case SlotNum_53:
  2064. {
  2065. //不支持读写
  2066. *nErrCode1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_INV_SLOT;
  2067. *nErrCode2 = 0x00;
  2068. nRet = DPV1_NOK;
  2069. }
  2070. break;
  2071. case SlotNum_54:
  2072. {
  2073. //保存要读取的事件类型和事件编号
  2074. m_nSoeType = pDataWrite[0] & 0xff;
  2075. DissembWordBigEdin(&pDataWrite[1], &m_nSoeIndex);
  2076. }
  2077. break;
  2078. }
  2079. return nRet;
  2080. }