/// <summary> /// 发送模式控制 /// </summary> /// <param name="info"></param> /// <returns></returns> public Result SendModeCtrl(ModeCtrlInfo info) { Result oResult = new Result(); if ((info.device_port > 24) || (info.device_port < 1)) { oResult.message = "device_port参数错误"; return(oResult); } if (info.bind.Length != 24) { oResult.message = "bind参数错误"; return(oResult); } try { CmdModeCtrl oCmdModeCtrl = new CmdModeCtrl(info); string strCmd = oCmdModeCtrl.GetPkg(); lock (NICSServerProgram.mMyServer) { var allSessions = NICSServerProgram.mMyServer.GetAllSessions(); int iCounter = allSessions.Count(p => p.ClientID == info.client_id); if (iCounter == 1) { MySession oMySession = allSessions.First(p => p.ClientID == info.client_id); oMySession.MySend(strCmd); NICSServerProgram.AddBypssMap(strCmd, DateTime.Now); oResult.message = "命令下发成功"; } else { oResult.message = "离线"; } } } catch (System.Exception ex) { oResult.message = ex.Message; } return(oResult); }
public CmdModeCtrl(ModeCtrlInfo info) { KEY = "CMD"; BODY_KEY = "BYPASS"; CLINET_ID = info.client_id; List <byte> lst = new List <byte>(); //控制器地址 lst.Add(info.addr); //命令类型 lst.Add(0x10); //写 ////参数1 端口对应的地址 switch (info.device_port) { case 1: lst.Add(0x10); break; case 2: lst.Add(0x11); break; case 3: lst.Add(0x12); break; case 4: lst.Add(0x13); break; case 5: lst.Add(0x14); break; case 6: lst.Add(0x15); break; case 7: lst.Add(0x16); break; case 8: lst.Add(0x17); break; case 9: lst.Add(0x18); break; case 10: lst.Add(0x19); break; case 11: lst.Add(0x1A); break; case 12: lst.Add(0x1B); break; case 13: lst.Add(0x1C); break; case 14: lst.Add(0x1D); break; case 15: lst.Add(0x1E); break; case 16: lst.Add(0x1F); break; case 17: lst.Add(0x80); break; case 18: lst.Add(0x81); break; case 19: lst.Add(0x82); break; case 20: lst.Add(0x83); break; case 21: lst.Add(0x84); break; case 22: lst.Add(0x85); break; case 23: lst.Add(0x86); break; case 24: lst.Add(0x87); break; default: lst.Add(0x10); break; } //参数2 模式:参见《模式对应表》中的编号 lst.Add(info.mode); //参数3 关联端口1~8 string strBindTmp = info.bind.Substring(0, 8); byte bBindTmp = Convert.ToByte(strBindTmp, 2); lst.Add(bBindTmp); //参数4 关联端口9~16 strBindTmp = info.bind.Substring(8, 8); bBindTmp = Convert.ToByte(strBindTmp, 2); lst.Add(bBindTmp); //参数5 关联端口17~24 strBindTmp = info.bind.Substring(16, 8); bBindTmp = Convert.ToByte(strBindTmp, 2); lst.Add(bBindTmp); //参数6 0x00 lst.Add(info.paramA); //参数7 0x00 lst.Add(info.paramB); //参数8 0x00 lst.Add(info.paramC); //计算校验(控制可以直接使用的) string strCrc = CRC.ToModbusCRC16(lst.ToArray(), true); //是否翻转 //16进制,转成16进制显示 foreach (var m in lst) { CONTENT += Convert.ToString(m, 16).ToUpper().PadLeft(2, '0'); } CONTENT = info.regulator_id + " " + info.host_ip + " " + info.host_port + " " + CONTENT + strCrc; }