//由于此处Para里面设置的可能是不同命令的IO参数,所以需要返回不同命令的实时获取的数据,此处不需要返回Byte字节数组 public List <byte[]> GetDataCommandBytes(IO_SERVER server, IO_COMMUNICATION Communication, IO_DEVICE device, List <IO_PARA> paras, IO_PARA currentpara, ref object sender) { List <byte[]> cmmdBytes = new List <byte[]>(); //必须Read的IO参数 List <ModbusFragmentStore> modbusCodes = new List <ModbusFragmentStore>(); for (int i = 0; i < paras.Count; i++) { ParaPack paraPack = new ParaPack(paras[i].IO_PARASTRING); if (!modbusCodes.Exists(x => x.StoredCode == paraPack.GetValue("内存区")) && paraPack.GetValue("内存区") != "") { ModbusFragmentStore stored = new ModbusFragmentStore(); stored.StoredCode = paraPack.GetValue("内存区"); stored.Fragments = new List <ModbusFragment>(); stored.Units = new List <ushort>(); modbusCodes.Add(stored); } paraPack.Dispose(); paraPack = null; } for (int i = 0; i < paras.Count; i++) { ParaPack paraPack = new ParaPack(paras[i].IO_PARASTRING); if (paraPack.GetValue("内存区") != "") { if (modbusCodes.Exists(x => x.StoredCode == paraPack.GetValue("内存区")) && paraPack.GetValue("内存区") != "") { ModbusFragmentStore stored = modbusCodes.Find(x => x.StoredCode == paraPack.GetValue("内存区")); if (paraPack.GetValue("偏置") != "") { ushort offset = 0; if (ushort.TryParse(paraPack.GetValue("偏置"), out offset)) { if (!stored.Units.Contains(offset)) { stored.Units.Add(offset); } } } } } } ModbusFragmentStore mainStored = new ModbusFragmentStore(); //由于modbus获取寄存器最大数量是124个,所以要进行分段,最大线圈数量是1999个 foreach (ModbusFragmentStore stored in modbusCodes) { stored.MakeFragment(); mainStored.Fragments.AddRange(stored.Fragments); } //获取要解析的命令 sender = mainStored; return(cmmdBytes); }
public override void SetUIParameter(IO_SERVER server, IO_DEVICE device, IO_PARA para) { base.SetUIParameter(server, device, para); if (para.IO_PARASTRING != null && para.IO_PARASTRING != "") { ParaPack paraPack = new ParaPack(para.IO_PARASTRING); paraPack.SetCtrlValue(tb_JsonName, paraPack.GetValue("IO标识")); paraPack.SetCtrlValue(nudTime, paraPack.GetValue("时间值索引")); paraPack.SetCtrlValue(cbDataType, paraPack.GetValue("数据类型")); paraPack.SetCtrlValue(nud_valueIndex, paraPack.GetValue("采集值索引")); paraPack.SetCtrlValue(tbCmdValue, paraPack.GetValue("命令默认值")); } this.ParaString = para.IO_PARASTRING; }
/// <summary> /// 初始化驱动 /// </summary> /// <param name="server"></param> /// <param name="communication"></param> /// <param name="ioDevices"></param> /// <param name="driver"></param> /// <returns></returns> protected override bool InitCommunicateKernel(IO_SERVER server, IO_COMMUNICATION communication, List <IO_DEVICE> ioDevices, SCADA_DRIVER driver) { try { ParaPack communicatePack = new ParaPack(communication.IO_COMM_PARASTRING); if (communication.IO_COMM_PARASTRING != null && communication.IO_COMM_PARASTRING != "") { this.ServerIP = communicatePack.GetValue("服务器IP"); this.ServerPort = int.Parse(communicatePack.GetValue("端口号")); this.UserName = communicatePack.GetValue("用户名"); this.Password = communicatePack.GetValue("密码"); this.EaableAnonymousAuthentication = bool.Parse(communicatePack.GetValue("开启匿名验证")); this.HeartTime = int.Parse(communicatePack.GetValue("心跳时间")); string msgqulity = communicatePack.GetValue("消息质量"); switch (msgqulity) { case "QoS 0 最多分发一次": MessageQulity = MqttQualityOfServiceLevel.AtMostOnce; break; case "QoS 1 至少分发一次": MessageQulity = MqttQualityOfServiceLevel.AtLeastOnce; break; case "QoS 2 只分发一次": MessageQulity = MqttQualityOfServiceLevel.ExactlyOnce; break; } this.WillFlag = communicatePack.GetValue("遗愿标志"); this.MqttDataType = communicatePack.GetValue("数据格式"); this.EaableClientIDAuthentication = bool.Parse(communicatePack.GetValue("开启Mqtt客户端识别")); } if (IsCreateControl) { CommunicationControl = new MQTTServerCtrl(); if (communication != null && communication.IO_COMM_PARASTRING != "") { CommunicationControl.SetUIParameter(communication.IO_COMM_PARASTRING); } } } catch (Exception emx) { this.DeviceException(emx.Message); return(false); } return(true); }
public override void SetUIParameter(string para) { ParaPack paraPack = new ParaPack(para); paraPack.SetCtrlValue(txtIP, paraPack.GetValue("本机IP")); paraPack.SetCtrlValue(nudPort, paraPack.GetValue("本机端口")); paraPack.SetCtrlValue(cbRegisterType, paraPack.GetValue("注册包")); paraPack.SetCtrlValue(nudIdLength, paraPack.GetValue("标识长度")); paraPack.SetCtrlValue(cbIdStoredType, paraPack.GetValue("存储方式")); paraPack.SetCtrlValue(cbReceiveType, paraPack.GetValue("接收方式")); paraPack.SetCtrlValue(tbHeartbear, paraPack.GetValue("心跳字节")); paraPack.SetCtrlValue(cbHeart, paraPack.GetValue("开启心跳")); paraPack.SetCtrlValue(nudTimeout, paraPack.GetValue("连接超时")); }
public override void SetUIParameter(IO_SERVER server, IO_DEVICE device) { ParaPack paraPack = new ParaPack(device.IO_DEVICE_PARASTRING); paraPack.SetCtrlValue(tbIdentification, paraPack.GetValue("注册标识")); paraPack.SetCtrlValue(txtAddress, device.IO_DEVICE_ADDRESS); paraPack.SetCtrlValue(cbModbusType, paraPack.GetValue("Modbus类型")); paraPack.SetCtrlValue(nbReadTimeout, paraPack.GetValue("读超时")); paraPack.SetCtrlValue(nbWriteTimeout, paraPack.GetValue("写超时")); paraPack.SetCtrlValue(ndReadBuffSize, paraPack.GetValue("读缓存")); paraPack.SetCtrlValue(ndWriteBufferSize, paraPack.GetValue("写缓存")); paraPack.SetCtrlValue(cbRetries, paraPack.GetValue("失败重试")); paraPack.SetCtrlValue(ndRetiresNum, paraPack.GetValue("重试次数")); paraPack.SetCtrlValue(nbRetiresInternal, paraPack.GetValue("重试间隔")); }
protected override bool InitDeviceKernel(IO_SERVER server, IO_COMMUNICATION communication, IO_DEVICE device, IO_PARA para, SCADA_DEVICE_DRIVER driver) { if (IsCreateControl) { ParaPack commPack = new ParaPack(communication.IO_COMM_PARASTRING); ParaPack devicePack = new ParaPack(device.IO_DEVICE_PARASTRING); if (para != null) { //数据格式 if (commPack.GetValue("数据格式") == "江苏协昌环保股份有限公司") { this.ParaCtrl = new IOParaCtrl(); this.ParaCtrl.SetUIParameter(server, device, para); } else if (commPack.GetValue("数据格式") == "通用MQTT解析") { this.ParaCtrl = new GasIOParaCtrl(); this.ParaCtrl.SetUIParameter(server, device, para); } } if (commPack.GetValue("数据格式") == "江苏协昌环保股份有限公司") { this.DeviceCtrl = new IODeviceCtrl(); this.DeviceCtrl.SetUIParameter(server, device); } else if (commPack.GetValue("数据格式") == "通用MQTT解析") { this.DeviceCtrl = new GasIODeviceCtrl(); this.DeviceCtrl.SetUIParameter(server, device); } } if (para != null) { this.ParaString = para.IO_PARASTRING; } this.DeviceParaString = device.IO_DEVICE_PARASTRING; return(true); }
public override void SetUIParameter(IO_SERVER server, IO_DEVICE device, IO_PARA para) { base.SetUIParameter(server, device, para); if (para.IO_PARASTRING != null && para.IO_PARASTRING != "") { ParaPack paraPack = new ParaPack(para.IO_PARASTRING); paraPack.SetCtrlValue(tb_JsonName, paraPack.GetValue("JSON名称")); paraPack.SetCtrlValue(nud_boardAddress, paraPack.GetValue("版子地址")); paraPack.SetCtrlValue(nud_boardIndex, paraPack.GetValue("版子索引号")); paraPack.SetCtrlValue(nud_port, paraPack.GetValue("端口号")); paraPack.SetCtrlValue(nud_PortIndex, paraPack.GetValue("端口索引号")); paraPack.SetCtrlValue(cb_DataType, paraPack.GetValue("数据类型")); paraPack.SetCtrlValue(nud_valueIndex, paraPack.GetValue("采集值索引号")); paraPack.SetCtrlValue(cbParaType, paraPack.GetValue("是否命令参数")); } this.ParaString = para.IO_PARASTRING; }
public override void SetUIParameter(IO_SERVER server, IO_DEVICE device, IO_PARA para) { ParaPack paraPack = new ParaPack(device.IO_DEVICE_PARASTRING); paraPack.SetCtrlValue(cbo_functioncode, paraPack.GetValue("内存区")); paraPack.SetCtrlValue(ndOffset, paraPack.GetValue("偏置")); paraPack.SetCtrlValue(cbo_StoreType, paraPack.GetValue("数据类型")); paraPack.SetCtrlValue(cbo_datatype, paraPack.GetValue("存储位置")); paraPack.SetCtrlValue(ndCharSize, paraPack.GetValue("字节长度")); paraPack.SetCtrlValue(cbPosition, paraPack.GetValue("按位存取")); paraPack.SetCtrlValue(ndPosition, paraPack.GetValue("数据位")); if (paraPack.GetValue("读写状态") == "可读可写") { paraPack.SetCtrlValue(rb_rw, "1"); } if (paraPack.GetValue("读写状态") == "可读") { paraPack.SetCtrlValue(rb_r, 1); } if (paraPack.GetValue("读写状态") == "可写") { paraPack.SetCtrlValue(rb_w, 1); } }
public void SetParament(string parastr) { ParaPack para = new ParaPack(parastr); if (para.Count > 0) { ///内存区 for (int i = 0; i < cbo_functioncode.Items.Count; i++) { ModbusFunctionCode funCode = (ModbusFunctionCode)cbo_functioncode.Items[i]; if (funCode.Code == para.GetValue("内存区")) { cbo_functioncode.SelectedIndex = i; break; } } //数据类型 for (int i = 0; i < cbo_StoreType.Items.Count; i++) { ModbusDataType datatype = (ModbusDataType)cbo_StoreType.Items[i]; if (datatype.ToString() == para.GetValue("数据类型")) { cbo_StoreType.SelectedIndex = i; break; } } //偏置 this.ndOffset.Value = para.GetValue("偏置") == "" ? 0: Convert.ToDecimal(para.GetValue("偏置")); this.ndCharSize.Value = para.GetValue("字节长度") == "" ? 0 : Convert.ToDecimal(para.GetValue("字节长度")); this.ndPosition.Value = para.GetValue("数据位") == "" ? 0 : Convert.ToDecimal(para.GetValue("数据位")); //存储位置 for (int i = 0; i < cbo_datatype.Items.Count; i++) { string datatype = (string)cbo_datatype.Items[i]; if (datatype.ToString() == para.GetValue("存储位置")) { cbo_datatype.SelectedIndex = i; break; } } //按位存取 this.cbPosition.Checked = para.GetValue("按位存取") == "1" ? true : false; } }
public override void SetUIParameter(IO_SERVER server, IO_DEVICE device) { base.SetUIParameter(server, device); ParaPack paraPack = new ParaPack(device.IO_DEVICE_PARASTRING); if (device.IO_DEVICE_PARASTRING != null && device.IO_DEVICE_PARASTRING != "") { paraPack.SetCtrlValue(tb_devID, device.IO_DEVICE_ADDRESS); paraPack.SetCtrlValue(tb_devVersion, paraPack.GetValue("版本号")); paraPack.SetCtrlValue(tb_devSoftVision, paraPack.GetValue("软件版本")); paraPack.SetCtrlValue(tb_devHardVersion, paraPack.GetValue("硬件版本")); paraPack.SetCtrlValue(tb_MqttID, paraPack.GetValue("MQTT连接ID号")); paraPack.SetCtrlValue(tb_subTopic, paraPack.GetValue("订阅主题")); paraPack.SetCtrlValue(tb_cmdSubTopic, paraPack.GetValue("命令主题")); paraPack.SetCtrlValue(this.tbTimes, paraPack.GetValue("时间主题")); } else { paraPack.SetCtrlValue(tb_devID, device.IO_DEVICE_ADDRESS); } this.ParaString = device.IO_DEVICE_PARASTRING; }
public override void SetUIParameter(IO_SERVER server, IO_DEVICE device) { base.SetUIParameter(server, device); ParaPack paraPack = new ParaPack(device.IO_DEVICE_PARASTRING); if (device.IO_DEVICE_PARASTRING != null && device.IO_DEVICE_PARASTRING != "") { paraPack.SetCtrlValue(tb_devID, paraPack.GetValue("设备ID编码")); paraPack.SetCtrlValue(tb_MqttID, paraPack.GetValue("MQTT连接ID号")); paraPack.SetCtrlValue(tb_subTopic, paraPack.GetValue("数据订阅主题")); paraPack.SetCtrlValue(tb_cmdSubTopic, paraPack.GetValue("下置命令主题")); paraPack.SetCtrlValue(this.tbTimes, paraPack.GetValue("循环周期主题")); paraPack.SetCtrlValue(this.tbRecieveType, paraPack.GetValue("主动请求主题")); } else { paraPack.SetCtrlValue(tb_devID, device.IO_DEVICE_ADDRESS); } this.ParaString = device.IO_DEVICE_PARASTRING; }
/// <summary> /// 解析数据 /// </summary> /// <param name="server"></param> /// <param name="Communication"></param> /// <param name="device"></param> /// <param name="para"></param> /// <param name="datas"></param> /// <param name="datatime"></param> /// <param name="sender"></param> /// <returns></returns> protected override IOData Analysis(IO_SERVER server, IO_COMMUNICATION Communication, IO_DEVICE device, IO_PARA para, byte[] datas, DateTime datatime, object sender) { if (datas.Length > 0 && sender != null && para != null) { ParaPack paraPack = new ParaPack(para.IO_PARASTRING); ModbusFragmentStore modbusStore = (ModbusFragmentStore)sender; IOData data = new IOData(); data.CommunicationID = Communication.IO_COMM_ID; data.ID = device.IO_DEVICE_ADDRESS; data.ParaName = para.IO_NAME; data.ServerID = server.SERVER_ID; data.Date = DateTime.Now; Modbus_Type dataType = (Modbus_Type)Enum.Parse(typeof(Modbus_Type), paraPack.GetValue("数据类型")); switch (dataType) { case Modbus_Type.单精度浮点数32位: data.DataType = typeof(float); break; case Modbus_Type.双精度浮点数64位: data.DataType = typeof(double); break; case Modbus_Type.字符型: data.DataType = typeof(string); break; case Modbus_Type.无符号整数16位: data.DataType = typeof(UInt16); break; case Modbus_Type.无符号整数32位: data.DataType = typeof(UInt32); break; case Modbus_Type.无符号整数8位: data.DataType = typeof(byte); break; case Modbus_Type.符号整数16位: data.DataType = typeof(Int16); break; case Modbus_Type.符号整数8位: data.DataType = typeof(sbyte); break; case Modbus_Type.符号整数32位: data.DataType = typeof(int); break; } data.datas = datas; data.ParaString = para.IO_PARASTRING; //获取数据值高八位,低八位 int startaddr = int.Parse(paraPack.GetValue("偏置")); int charsize = int.Parse(paraPack.GetValue("字节长度")); string code = paraPack.GetValue("内存区"); bool bitSave = paraPack.GetValue("按位存取") == "1" ? true : false; bool ishigh = paraPack.GetValue("存储位置") == "高八位" ? true : false; ModbusFragment fragment = modbusStore.Fragments.Find(x => x.Code == code && startaddr >= x.StartRegister && startaddr <= x.StartRegister + x.RegisterNum); if (fragment != null) { switch (code) { case "01": //线圈 { byte[] vdatas = new byte[fragment.Length]; Array.Copy(datas, fragment.StartIndex, vdatas, 0, fragment.Length); data.ParaValue = vdatas[startaddr].ToString(); } break; case "02": //线圈只读 { byte[] vdatas = new byte[fragment.Length]; Array.Copy(datas, fragment.StartIndex, vdatas, 0, fragment.Length); data.ParaValue = vdatas[startaddr].ToString(); } break; case "03": //寄存器可读可写 { //注意是否按位读取, byte[] vdatas = new byte[fragment.Length]; Array.Copy(datas, fragment.StartIndex, vdatas, 0, fragment.Length); ushort[] vals = ModbusConvert.Bytes2Ushorts(vdatas); //将字节数组转为ushort switch (dataType) { case Modbus_Type.单精度浮点数32位: { data.ParaValue = ModbusConvert.GetReal(vals, 0).ToString(); } break; case Modbus_Type.双精度浮点数64位: { data.ParaValue = ModbusConvert.GetDouble(vals, 0).ToString(); } break; case Modbus_Type.字符型: { data.ParaValue = ModbusConvert.GetString(vals, 0, charsize).ToString(); } break; case Modbus_Type.无符号整数16位: { data.ParaValue = ModbusConvert.GetUShort(vals, 0).ToString(); } break; case Modbus_Type.无符号整数32位: { data.ParaValue = ModbusConvert.GetUInt(vals, 0).ToString(); } break; case Modbus_Type.无符号整数8位: { data.ParaValue = ModbusConvert.GetSByte(vals, 0, ishigh).ToString(); } break; case Modbus_Type.符号整数16位: { data.ParaValue = ModbusConvert.GetShort(vals, 0).ToString(); } break; case Modbus_Type.符号整数8位: { data.ParaValue = ModbusConvert.GetByte(vals, 0, ishigh).ToString(); } break; case Modbus_Type.符号整数32位: { data.ParaValue = ModbusConvert.GetInt(vals, 0).ToString(); } break; } } break; case "04": //寄存器只读 { //注意是否按位读取, byte[] vdatas = new byte[fragment.Length]; Array.Copy(datas, fragment.StartIndex, vdatas, 0, fragment.Length); ushort[] vals = ModbusConvert.Bytes2Ushorts(vdatas); //将字节数组转为ushort switch (dataType) { case Modbus_Type.单精度浮点数32位: { data.ParaValue = ModbusConvert.GetReal(vals, 0).ToString(); } break; case Modbus_Type.双精度浮点数64位: { data.ParaValue = ModbusConvert.GetDouble(vals, 0).ToString(); } break; case Modbus_Type.字符型: { data.ParaValue = ModbusConvert.GetString(vals, 0, charsize).ToString(); } break; case Modbus_Type.无符号整数16位: { data.ParaValue = ModbusConvert.GetUShort(vals, 0).ToString(); } break; case Modbus_Type.无符号整数32位: { data.ParaValue = ModbusConvert.GetUInt(vals, 0).ToString(); } break; case Modbus_Type.无符号整数8位: { data.ParaValue = ModbusConvert.GetSByte(vals, 0, ishigh).ToString(); } break; case Modbus_Type.符号整数16位: { data.ParaValue = ModbusConvert.GetShort(vals, 0).ToString(); } break; case Modbus_Type.符号整数8位: { data.ParaValue = ModbusConvert.GetByte(vals, 0, ishigh).ToString(); } break; case Modbus_Type.符号整数32位: { data.ParaValue = ModbusConvert.GetInt(vals, 0).ToString(); } break; } } break; } } } return(null); }
public override void SetUIParameter(string para) { //初始化 base.SetUIParameter(para); ParaPack paraPack = new ParaPack(para); //波特率 tbSMDeviceIP.Text = paraPack.GetValue("模拟设备IP"); ndSMPort.Text = paraPack.GetValue("模拟设备端口"); tbLocalIP.Text = paraPack.GetValue("本地IP"); ndLocalPort.Text = paraPack.GetValue("本地端口"); cbRetries.Checked = paraPack.GetValue("重试") == "1" ? true : false; ndRetiresNum.Text = paraPack.GetValue("重试次数"); nbRetiresInternal.Text = paraPack.GetValue("重试间隔"); nbWriteTimeout.Value = Convert.ToDecimal(paraPack.GetValue("写超时时间")); nbReadTimeout.Value = Convert.ToDecimal(paraPack.GetValue("读超时时间")); ndReadBuffSize.Value = Convert.ToDecimal(paraPack.GetValue("读缓存")); ndWriteBufferSize.Value = Convert.ToDecimal(paraPack.GetValue("写缓存")); }
protected override bool InitCommunicateKernel(IO_SERVER server, IO_COMMUNICATION communication, List <IO_DEVICE> ioDevices, SCADA_DRIVER driver) { if (IsCreateControl) { CommunicationControl = new Modbus_Serial_Ctrl(); if (communication != null) { CommunicationControl.SetUIParameter(communication.IO_COMM_PARASTRING); } } Serial_PARA = new Modbus_Serial_PARA(); if (communication != null) { comParaPack = new ParaPack(communication.IO_COMM_PARASTRING); Serial_PARA.BaudRate = Convert.ToInt32(comParaPack.GetValue("波特率")); Serial_PARA.CollectFaultsInternal = Convert.ToInt32(comParaPack.GetValue("重试间隔")); Serial_PARA.CollectFaultsNumber = Convert.ToInt32(comParaPack.GetValue("重试次数")); Serial_PARA.ContinueCollect = comParaPack.GetValue("连续采集") == "1" ? true : false; Serial_PARA.DataBits = Convert.ToInt32(comParaPack.GetValue("数据位")); Serial_PARA.ModbusType = (ModbusType)Enum.Parse(typeof(ModbusType), comParaPack.GetValue("MODBUS类型")); Serial_PARA.OffsetInterval = Convert.ToInt32(comParaPack.GetValue("偏移间隔")); Serial_PARA.PackMaxSize = Convert.ToInt32(comParaPack.GetValue("包最大长度")); Serial_PARA.ReadTimeout = Convert.ToInt32(comParaPack.GetValue("读超时时间")); Serial_PARA.RSTSendPreKeeyTime = Convert.ToInt32(comParaPack.GetValue("发送前RTS保持时间")); Serial_PARA.RTSSendAfterKeeyTime = Convert.ToInt32(comParaPack.GetValue("发送后RTS保持时间")); Serial_PARA.RTSEnable = comParaPack.GetValue("RTS") == "1" ? true : false; Serial_PARA.SerialCheck = (SerialCheck)Enum.Parse(typeof(SerialCheck), comParaPack.GetValue("校验")); Serial_PARA.SerialPort = comParaPack.GetValue("串口"); Serial_PARA.SimulatorSerialPort = comParaPack.GetValue("模拟器串口"); Serial_PARA.SixCommmand = comParaPack.GetValue("支持6号命令") == "1" ? true : false; Serial_PARA.SixteenCommmand = comParaPack.GetValue("支持16号命令") == "1" ? true : false;; Serial_PARA.StopBits = (StopBits)Enum.Parse(typeof(StopBits), comParaPack.GetValue("停止位")); Serial_PARA.WriteTimeout = Convert.ToInt32(comParaPack.GetValue("写超时时间")); //构造获取数据命令的字节数组,Modbus for (int i = 0; i < this.IODevices.Count; i++) { object fragment = new ModbusFragmentStore(); RealData mRealData = new RealData(); mRealData.Device = this.IODevices[i]; ScadaDeviceKernel driverDll = DeviceDrives.Find(x => x.DeviceDriverID == this.IODevices[i].DEVICE_DRIVER_ID); if (driverDll != null) { driverDll.InitKernel(IOServer, IOCommunication, this.IODevices[i], null, this.IODevices[i].DriverInfo); //IO_DEVICE_ADDRESS中存储的是DTU编号 mRealData.SlaveId = this.IODevices[i].IO_DEVICE_ADDRESS; //数据库中系统编号 mRealData.DEVICEID = this.IODevices[i].IO_DEVICE_ID; //获取下发命令的参数,注意此次要进心分段存储,因为modbus一次不能超过123个寄存器地址 mRealData.Fragment = (ModbusFragmentStore)fragment; RealDevices.Add(mRealData); } } } return(true); }
protected override void Start() { if (null != _mqttServer) { return; } ///相关参数不能为空 if (this.IOServer == null || this.IOCommunication == null) { return; } var optionBuilder = new MqttServerOptionsBuilder().WithConnectionBacklog(1000).WithDefaultEndpointPort(ServerPort); if (!String.IsNullOrEmpty(ServerIP)) { optionBuilder.WithDefaultEndpointBoundIPAddress(IPAddress.Parse(ServerIP)); } var options = optionBuilder.Build(); //连接验证 (options as MqttServerOptions).ConnectionValidator += context => { string clientId = ""; Task.Run(() => { try { ParaPack paraPack = new ParaPack(this.IOCommunication.IO_COMM_PARASTRING); if (context.ClientId.Length < 2) { context.ReturnCode = MqttConnectReturnCode.ConnectionRefusedIdentifierRejected; return; } if (EaableAnonymousAuthentication) { if (!context.Username.Equals(this.UserName)) { context.ReturnCode = MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword; return; } if (!context.Password.Equals(this.Password)) { context.ReturnCode = MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword; return; } } bool isValidCleint = false; for (int i = 0; i < IODevices.Count; i++) { ParaPack deviceparaPack = new ParaPack(IODevices[i].IO_DEVICE_PARASTRING); clientId = deviceparaPack.GetValue("MQTT连接ID号").Trim(); // 将字符串转换为字符数组 if (clientId.Trim() == context.ClientId.Trim()) { isValidCleint = true; IODevices[i].Tag = clientId.Trim();//标记对应的客户端ID号 } } if (isValidCleint) { context.ReturnCode = MqttConnectReturnCode.ConnectionAccepted; } else { context.ReturnCode = MqttConnectReturnCode.ConnectionRefusedIdentifierRejected; } } catch { context.ReturnCode = MqttConnectReturnCode.ConnectionRefusedIdentifierRejected; } if (string.IsNullOrEmpty(clientId)) { context.ReturnCode = MqttConnectReturnCode.ConnectionRefusedIdentifierRejected; } }); }; _mqttServer = new MqttFactory().CreateMqttServer(); //开始连接 _mqttServer.ClientConnected += (sender, args) => { if (args.ClientId == null || args.ClientId == "") { return; } IO_DEVICE device = this.IODevices.Find(x => x.Tag.ToString().Trim() == args.ClientId.Trim()); if (device == null) { for (int i = 0; i < IODevices.Count; i++) { ParaPack deviceparaPack = new ParaPack(IODevices[i].IO_DEVICE_PARASTRING); string clientId = deviceparaPack.GetValue("MQTT连接ID号").Trim(); // 将字符串转换为字符数组 if (clientId.Trim() == args.ClientId.Trim()) { IODevices[i].Tag = clientId.Trim();//标记对应的客户端ID号 device = IODevices[i]; break; } } } if (device == null) { return; } ParaPack commPack = new ParaPack(this.IOCommunication.IO_COMM_PARASTRING); ParaPack devicePack = new ParaPack(device.IO_DEVICE_PARASTRING); #region 通用MQTT解析 { //客户端连接上后发布订阅数据 List <TopicFilter> topicFilters = new List <TopicFilter>(); device.IO_DEVICE_STATUS = 1; this.DeviceStatus(this.IOServer, IOCommunication, device, null, "1"); string clientId = devicePack.GetValue("MQTT连接ID号").Trim(); // 将字符串转换为字符数组 device.Tag = clientId; if (clientId.Trim() == args.ClientId.Trim()) { TopicFilter topicFilter = new TopicFilter(devicePack.GetValue("数据订阅主题").Trim(), MessageQulity); topicFilters.Add(topicFilter); try { Task.Run(async() => { await _mqttServer.SubscribeAsync(args.ClientId.Trim(), topicFilters); }); } catch (Exception) { this.DeviceException("ERROR=MQTTNet_20006,发布订阅主题失败 "); } } else { this.DeviceException("ERROR=MQTTNet_20006,MQTT ID与设备配置ID不匹配 "); } //定时向客户端发布一个读取数据的订阅 if (commPack.GetValue("接收方式") == "主动") { MQTTTimer cleintMqtt = new MQTTTimer() { ClientID = args.ClientId }; MqttClientTimes.Add(cleintMqtt); cleintMqtt.Timer = new Timer(delegate { if (!cleintMqtt.IsStop) { try { _mqttServer.PublishAsync( new MqttApplicationMessage() { QualityOfServiceLevel = MessageQulity, Retain = false, Topic = devicePack.GetValue("主动请求主题").Trim(), Payload = Encoding.UTF8.GetBytes("{\"uid\":\"" + devicePack.GetValue("设备ID编码").Trim() + "\",\"updatecycle\":\"" + device.IO_DEVICE_UPDATECYCLE + "\",\"topic\":\"" + devicePack.GetValue("数据订阅主题").Trim() + "\"}") } ); ///服务端向客户端发送一个服务器端循环查询数据的周期 _mqttServer.PublishAsync( new MqttApplicationMessage() { QualityOfServiceLevel = MessageQulity, Retain = false, Topic = devicePack.GetValue("循环周期主题").Trim(), Payload = Encoding.UTF8.GetBytes("{\"uid\":\"" + devicePack.GetValue("设备ID编码").Trim() + "\",\"updatecycle\":\"" + device.IO_DEVICE_UPDATECYCLE + "\",\"topic\":\"" + devicePack.GetValue("数据订阅主题").Trim() + "\"}") } ); } catch (Exception) { this.DeviceException("ERROR=MQTTNet_20006,发布订阅主题失败 "); } } }, args, 1000, device.IO_DEVICE_UPDATECYCLE * 1000); } } #endregion }; ///断开连接 _mqttServer.ClientDisconnected += (sender, args) => { Task.Run(() => { if (args.WasCleanDisconnect) { IO_DEVICE device = this.IODevices.Find(x => x.Tag.ToString().Trim() == args.ClientId.Trim()); if (device != null) { device.IO_DEVICE_STATUS = 0; this.DeviceStatus(this.IOServer, IOCommunication, device, null, "0"); } } }); MQTTTimer cleintTimer = MqttClientTimes.Find(x => x.ClientID == args.ClientId); if (cleintTimer != null) { cleintTimer.Close(); MqttClientTimes.Remove(cleintTimer); } }; ///接收到订阅主题的数据数据 _mqttServer.ApplicationMessageReceived += (sender, args) => { if (args.ClientId == null || args.ClientId.Trim() == "") { return; } if (args.ApplicationMessage.Payload == null || args.ApplicationMessage.Payload.Length <= 0) { this.DeviceException("接收的数据为空"); return; } ParaPack commPack = new ParaPack(this.IOCommunication.IO_COMM_PARASTRING); try { Task.Run(() => { string cleintId = args.ClientId.Trim(); //将接收到的数据发送到实际的对应的解析数据库中 List <IO_DEVICE> selects = this.IODevices.FindAll(x => x.Tag.ToString().Trim() == args.ClientId.Trim()); if (selects.Count <= 0) { return; } string strs = ScadaHexByteOperator.UTF8ByteToString(args.ApplicationMessage.Payload); IO_DEVICE device = null; for (int i = 0; i < selects.Count; i++) { ParaPack selePack = new ParaPack(selects[i].IO_DEVICE_PARASTRING); #region CommonMqttJsonObject mqttJsonObject = ScadaHexByteOperator.JsonToObject <CommonMqttJsonObject>(strs); if (mqttJsonObject == null || mqttJsonObject.paras == null || mqttJsonObject.paras.Count <= 0) { this.DeviceException("接收数据对象转换失败了,没有数据" + strs.Count()); this.DeviceException(strs); continue; } string selectUid = selePack.GetValue("设备ID编码"); if (selectUid.Trim() == mqttJsonObject.device.uid.Trim()) { device = selects[i]; break; } #endregion } if (device == null) { return; } device.IO_DEVICE_STATUS = 1; ParaPack paraPack = new ParaPack(device.IO_DEVICE_PARASTRING); #region string deviceUid = paraPack.GetValue("设备ID编码"); if (!string.IsNullOrEmpty(device.IO_DEVICE_PARASTRING) && args.ApplicationMessage.Topic.Trim() == paraPack.GetValue("数据订阅主题").Trim()) { CommonMqttJsonObject mqttJsonObject = ScadaHexByteOperator.JsonToObject <CommonMqttJsonObject>(strs); this.ReceiveData(this.IOServer, IOCommunication, device, args.ApplicationMessage.Payload, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), mqttJsonObject); } #endregion }); } catch { return; } }; ///订阅主题 _mqttServer.ClientSubscribedTopic += (sender, args) => { }; ///取消订阅主题 _mqttServer.ClientUnsubscribedTopic += (sender, args) => { }; _mqttServer.Started += (sender, args) => { this.IOCommunication.IO_COMM_STATUS = 1; }; _mqttServer.Stopped += (sender, args) => { this.IOCommunication.IO_COMM_STATUS = 0; }; _mqttServer.StartAsync(options); ParaPack commpack = new ParaPack(this.IOCommunication.IO_COMM_PARASTRING); this.CommunctionStartChanged(this.IOServer, this.IOServer.SERVER_IP + " " + this.IOServer.SERVER_NAME + "启动服务"); }
public override void SimulatorStart() { if (simulatorTimer == null) { simulatorTimer = new Timer(delegate { Task.Run(() => { for (int i = 0; i < this.IODevices.Count; i++) { try { ParaPack devicePack = new ParaPack(this.IODevices[i].IO_DEVICE_PARASTRING); //构造Json模拟数据 MqttJsonObject mqttJsonObject = new MqttJsonObject(); mqttJsonObject.paras = new List <MqttJsonPara>(); mqttJsonObject.device = new MqttJsonDevice() { hard_version = "1.0.0", run_time = "", soft_version = "1.0.0", status = "normal", uid = devicePack.GetValue("设备识别号") }; for (int p = 0; p < this.IODevices[i].IOParas.Count; p++) { if (this.IODevices[i].IOParas[p].IO_POINTTYPE == "模拟量" || this.IODevices[i].IOParas[p].IO_POINTTYPE == "开关量") { int simulatorValue = 0; if (this.IODevices[i].IOParas[p].IO_MINVALUE != this.IODevices[i].IOParas[p].IO_MAXVALUE) { int min = -100; if (this.IODevices[i].IOParas[p].IO_MINVALUE != null && this.IODevices[i].IOParas[p].IO_MINVALUE != "") { min = int.Parse(this.IODevices[i].IOParas[p].IO_MINVALUE); } int max = 100; if (this.IODevices[i].IOParas[p].IO_MAXVALUE != null && this.IODevices[i].IOParas[p].IO_MAXVALUE != "") { min = int.Parse(this.IODevices[i].IOParas[p].IO_MAXVALUE); } simulatorValue = random.Next(min, max); } else { simulatorValue = random.Next(-100, 100); } ParaPack paraPack = new ParaPack(this.IODevices[i].IOParas[p].IO_PARASTRING); mqttJsonObject.paras.Add(new MqttJsonPara() { name = paraPack.GetValue("JSON名称"), datatype = paraPack.GetValue("数据类型"), iotype = "analog", version = "1.0.0", data = new List <object>() { DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), paraPack.GetValue("版子地址"), paraPack.GetValue("端口号"), simulatorValue } }); } } // string json = ScadaHexByteOperator.ObjectToJson(mqttJsonObject); if (mqttJsonObject != null) { byte[] datas = ScadaHexByteOperator.StringToUTF8Byte(json); this.ReceiveData(this.IOServer, this.IOCommunication, this.IODevices[i], datas, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } this.SimulatorAppendLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 时间初始化一条设备模拟数据!"); } catch (Exception emx) { this.SimulatorAppendLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 接收数据错误! " + emx.Message); } } }); }, null, 1000, Internal * 1000); } }
protected override ScadaResult IOSendCommand(IO_SERVER server, IO_COMMUNICATION comm, IO_DEVICE device, IO_PARA para, string value) { try { ParaPack deviceparaPack = new ParaPack(device.IO_DEVICE_PARASTRING); ParaPack paraPack = new ParaPack(para.IO_PARASTRING); ///向指定客户端的指定设备发送下置命令的数据 Task.Run(async() => { if (deviceparaPack.GetValue("数据格式") == "江苏协昌环保股份有限公司") { string paraType = paraPack.GetValue("是否命令参数"); string cmdJson = ""; switch (paraType) { case "采集参数": cmdJson = "{\"uid\":\"" + device.IO_DEVICE_ADDRESS + "\",\"paraname\":\"" + para.IO_NAME + "\",\"value\":\"" + value + "\",\"jsonname\":\"" + paraPack.GetValue("JSON名称") + "\",\"defaultvalue\":\"null\"}"; break; case "升级命令": cmdJson = "{\"uid\":\"" + device.IO_DEVICE_ADDRESS + "\",\"paraname\":\"" + para.IO_NAME + "\",\"value\":\"" + value + "\",\"jsonname\":\"oa\",\"defaultvalue\":\"null\"}"; break; case "开关量扫描": break; case "复合采集扫描": break; case "脉宽扫描": break; case "电流扫描": break; case "重启命令": break; } string topic = deviceparaPack.GetValue("命令主题").Trim(); // 将字符串转换为字符数组 await this._mqttServer.PublishAsync(new MqttApplicationMessage() { Topic = topic, QualityOfServiceLevel = MessageQulity, Retain = true, Payload = Scada.Kernel.ScadaHexByteOperator.StringToAsciiByte(cmdJson) }); } else if (deviceparaPack.GetValue("数据格式") == "通用MQTT解析") { string cmdJson = "{\"uid\":\"" + device.IO_DEVICE_ADDRESS + "\",\"paraname\":\"" + para.IO_NAME + "\",\"value\":\"" + value + "\",\"jsonname\":\"" + paraPack.GetValue("IO标识") + "\",\"defaultvalue\":\"" + paraPack.GetValue("命令默认值") + "\"}"; string topic = deviceparaPack.GetValue("下置命令主题").Trim(); // 将字符串转换为字符数组 await this._mqttServer.PublishAsync(new MqttApplicationMessage() { Topic = topic, QualityOfServiceLevel = MessageQulity, Retain = true, Payload = Scada.Kernel.ScadaHexByteOperator.StringToAsciiByte(cmdJson) }); } }); return(new ScadaResult()); } catch (Exception emx) { return(new ScadaResult(false, emx.Message)); } }
protected override IOData Analysis(IO_SERVER server, IO_COMMUNICATION Communication, IO_DEVICE device, IO_PARA para, byte[] datas, DateTime datatime, object sender) { ParaPack commPack = new ParaPack(Communication.IO_COMM_PARASTRING); ParaPack devicePack = new ParaPack(device.IO_DEVICE_PARASTRING); IOData data = new IOData(); data.QualityStamp = QualityStamp.BAD; if (device == null) { return(data); } if (para == null) { return(data); } if (sender == null) { return(data); } if (datas.Length <= 0) { return(data); } if (commPack.GetValue("数据格式") == "江苏协昌环保股份有限公司") { #region 江苏协昌环保股份有限公司 try { ParaPack paraPack = new ParaPack(para.IO_PARASTRING); string deviceUid = devicePack.GetValue("设备识别号").Trim(); data.CommunicationID = Communication.IO_COMM_ID; data.ID = device.IO_DEVICE_ADDRESS; data.ParaName = para.IO_NAME; data.ServerID = server.SERVER_ID; data.Date = DateTime.Now; string str = ScadaHexByteOperator.UTF8ByteToString(datas); MqttJsonObject mqttJsonObject = (MqttJsonObject)sender; if (mqttJsonObject != null && !string.IsNullOrEmpty(deviceUid) && mqttJsonObject.device.uid.Trim() == deviceUid.Trim()) { //由于一次性获取的是所有数据,所以需要解析所有数据 data.QualityStamp = QualityStamp.GOOD; string jsonname = paraPack.GetValue("JSON名称").Trim(); string boardAddress = paraPack.GetValue("版子地址"); string boardIndex = paraPack.GetValue("版子索引号"); string port = paraPack.GetValue("端口号"); string portIndex = paraPack.GetValue("端口索引号"); string DataType = paraPack.GetValue("数据类型"); string valueIndex = paraPack.GetValue("采集值索引号"); if (mqttJsonObject.paras != null) { MqttJsonPara selectObj = mqttJsonObject.paras.Find(x => x.name.Trim() == jsonname.Trim()); if (selectObj != null) { if (selectObj.data != null && selectObj.data.Count > 0) { string date = selectObj.data[0].ToString(); try { ///解析Json数据 DateTime?dateTime = GetDateTime(date); if (dateTime != null) { string pboardAddress = selectObj.data[int.Parse(boardIndex)].ToString(); string pport = selectObj.data[int.Parse(portIndex)].ToString(); string value = selectObj.data[int.Parse(valueIndex)].ToString(); data.QualityStamp = QualityStamp.GOOD; data.ParaValue = value; data.Date = dateTime; } else { data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); } } catch (Exception emx) { this.DeviceException(emx.Message); data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); } } } else { data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); } } } else { data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); } } catch (Exception emx) { data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); this.DeviceException(emx.Message); } #endregion } else if (commPack.GetValue("数据格式") == "通用MQTT解析") { #region 通用MQTT解析 try { ParaPack paraPack = new ParaPack(para.IO_PARASTRING); string deviceUid = devicePack.GetValue("设备ID编码").Trim(); data.CommunicationID = Communication.IO_COMM_ID; data.ID = device.IO_DEVICE_ADDRESS; data.ParaName = para.IO_NAME; data.ServerID = server.SERVER_ID; data.Date = DateTime.Now; string str = ScadaHexByteOperator.UTF8ByteToString(datas); CommonMqttJsonObject mqttJsonObject = (CommonMqttJsonObject)sender; if (mqttJsonObject != null && !string.IsNullOrEmpty(deviceUid) && mqttJsonObject.device.uid.Trim() == deviceUid.Trim()) { //由于一次性获取的是所有数据,所以需要解析所有数据 data.QualityStamp = QualityStamp.GOOD; string jsonname = paraPack.GetValue("IO标识").Trim(); string timeIndex = paraPack.GetValue("时间值索引"); string DataType = paraPack.GetValue("数据类型"); string valueIndex = paraPack.GetValue("采集值索引"); if (DataType == "命令参数") { data.QualityStamp = QualityStamp.GOOD; data.ParaValue = data.QualityStampValue.ToString(); return(data); } //采集参数 if (mqttJsonObject.paras != null) { CommonMqttJsonPara selectObj = mqttJsonObject.paras.Find(x => x.name.Trim() == jsonname.Trim()); if (selectObj != null) { if (selectObj.data != null && selectObj.data.Count > 0) { string date = selectObj.data.Count > (int.Parse(timeIndex) + 1)? selectObj.data[int.Parse(timeIndex)].ToString():DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,f"); try { ///解析Json数据 DateTime?dateTime = GetDateTime(date); if (dateTime != null) { string value = selectObj.data.Count > (int.Parse(valueIndex) + 1) ? selectObj.data[int.Parse(valueIndex)].ToString():"-9999"; data.QualityStamp = value != "-9999"?QualityStamp.GOOD: QualityStamp.BAD; data.ParaValue = value; data.Date = dateTime; } else { data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); } } catch (Exception emx) { this.DeviceException(emx.Message); data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); } } } else { data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); } } } else { data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); } } catch (Exception emx) { data.QualityStamp = QualityStamp.BAD; data.ParaValue = data.QualityStampValue.ToString(); this.DeviceException(emx.Message); } #endregion } return(data); }
private bool ResponseData(IO_SERVER server, IO_COMMUNICATION comm, IO_DEVICE device, IO_PARA para, string value) { if (para == null) { return(false); } if (para.IO_POINTTYPE == "计算值" || para.IO_POINTTYPE == "关系数据库值") { return(false); } //设备地址不能为空 if (device.IO_DEVICE_ADDRESS == "") { return(false); } try { //通过设备驱动进行数据解析,并生成下置的数据bytes if (device.DeviceDrive != null) { ScadaDeviceKernel Driver = (ScadaDeviceKernel)device.DeviceDrive; //获取参数中的 if (udpClient != null && master != null) { ParaPack paraPack = new ParaPack(para.IO_PARASTRING); if (paraPack.Count > 0) { ushort offset = ushort.Parse(paraPack.GetValue("偏置")); switch (paraPack.GetValue("内存区")) { case "01": { if (ushort.Parse(value) > 0) { master.WriteSingleCoil(byte.Parse(device.IO_DEVICE_ADDRESS), offset, true); } else { master.WriteSingleCoil(byte.Parse(device.IO_DEVICE_ADDRESS), offset, false); } } break; case "02": //此类型只能查询,不能写入 { } break; case "03": { Modbus_Type datatype = (Modbus_Type)Enum.Parse(typeof(Modbus_Type), paraPack.GetValue("数据类型")); bool ishigh = paraPack.GetValue("存储位置") == "高八位" ? true : false; int charsize = int.Parse(paraPack.GetValue("字节长度")); bool isposition = paraPack.GetValue("按位存取") == "1" ? true : false; int dataposition = int.Parse(paraPack.GetValue("数据位")); switch (datatype) { case Modbus_Type.单精度浮点数32位: { ushort[] buff = new ushort[2]; float WriteValue = float.Parse(value); ModbusConvert.SetReal(buff, 0, WriteValue); master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff); } break; case Modbus_Type.双精度浮点数64位: { ushort[] buff = new ushort[4]; double WriteValue = double.Parse(value); ModbusConvert.SetDouble(buff, 0, WriteValue); master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff); } break; case Modbus_Type.字符型: { ushort[] buff = new ushort[charsize]; string WriteValue = value; if (value.Length > charsize) { WriteValue = value.Substring(0, charsize); } if (value.Length < charsize) { WriteValue = value.PadRight(charsize, ' '); } ModbusConvert.SetString(buff, 0, WriteValue); master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff); } break; case Modbus_Type.无符号整数8位: { ushort[] buff = new ushort[1]; byte WriteValue = byte.Parse(value); ModbusConvert.SetByte(buff, 0, WriteValue, ishigh); master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff[0]); } break; case Modbus_Type.符号整数8位: { ushort[] buff = new ushort[1]; sbyte WriteValue = sbyte.Parse(value); ModbusConvert.SetSByte(buff, 0, WriteValue, ishigh); master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff[0]); } break; case Modbus_Type.无符号整数16位: { if (isposition) { //获取当前寄存器的值 ushort[] datas = master.ReadHoldingRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, 1); ushort dataValue = ModbusConvert.GetUShort(datas, 0); if (short.Parse(value) > 0) { dataValue = Convert.ToUInt16(dataValue >> dataposition & 1); } else { dataValue = Convert.ToUInt16(dataValue >> dataposition & 0); } //新发送的值 ushort[] datas2 = new ushort[1]; ModbusConvert.SetUShort(datas2, 0, dataValue); master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, datas2[0]); } else { ushort WriteValue = ushort.Parse(value); ushort[] buff = new ushort[1]; ModbusConvert.SetUShort(buff, 0, WriteValue); master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff[0]); } } break; case Modbus_Type.符号整数16位: { if (isposition) { //获取当前寄存器的值 ushort[] datas = master.ReadHoldingRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, 1); short dataValue = ModbusConvert.GetShort(datas, 0); if (short.Parse(value) > 0) { dataValue = Convert.ToInt16(dataValue >> dataposition & 1); } else { dataValue = Convert.ToInt16(dataValue >> dataposition & 0); } //新发送的值 ushort[] datas2 = new ushort[1]; ModbusConvert.SetShort(datas2, 0, dataValue); master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, datas2[0]); } else { Int16 WriteValue = Int16.Parse(value); ushort[] buff = new ushort[1]; ModbusConvert.SetShort(buff, 0, WriteValue); master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff[0]); } } break; case Modbus_Type.无符号整数32位: { uint WriteValue = uint.Parse(value); ushort[] buff = new ushort[2]; ModbusConvert.SetUInt(buff, 0, WriteValue); master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff); } break; case Modbus_Type.符号整数32位: { int WriteValue = int.Parse(value); ushort[] buff = new ushort[2]; ModbusConvert.SetInt(buff, 0, WriteValue); master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff); } break; } } break; } } } } } catch { return(false); } return(true); }
public override void SetUIParameter(string para) { cbReceiveMethod.SelectedIndex = 0; cbMessage.SelectedIndex = 0; cbWill.SelectedIndex = 0; cbDataType.SelectedIndex = 0; if (!string.IsNullOrEmpty(para)) { ParaPack paraPack = new ParaPack(para); paraPack.SetCtrlValue(txtIp, paraPack.GetValue("服务器IP")); paraPack.SetCtrlValue(nudPort, paraPack.GetValue("端口号")); paraPack.SetCtrlValue(tbUser, paraPack.GetValue("用户名")); paraPack.SetCtrlValue(tbPwd, paraPack.GetValue("密码")); paraPack.SetCtrlValue(cbEnableUser, paraPack.GetValue("开启匿名验证")); paraPack.SetCtrlValue(tbHeart, paraPack.GetValue("心跳时间")); paraPack.SetCtrlValue(cbMessage, paraPack.GetValue("消息质量")); paraPack.SetCtrlValue(cbWill, paraPack.GetValue("遗愿标志")); paraPack.SetCtrlValue(cbDataType, paraPack.GetValue("数据格式")); paraPack.SetCtrlValue(cbClientIDEnable, paraPack.GetValue("开启Mqtt客户端识别")); paraPack.SetCtrlValue(cbReceiveMethod, paraPack.GetValue("接收方式")); } else { string AddressIP = "127.0.0.1"; foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList) { if (_IPAddress.AddressFamily.ToString() == "InterNetwork") { AddressIP = _IPAddress.ToString(); } } txtIp.Text = AddressIP; } }
protected override bool InitCommunicateKernel(IO_SERVER server, IO_COMMUNICATION communication, List <IO_DEVICE> ioDevices, SCADA_DRIVER driver) { if (IsCreateControl) { CommunicationControl = new Modbus_UDP_Ctrl(); if (communication != null) { CommunicationControl.SetUIParameter(communication.IO_COMM_PARASTRING); } } Udp_PARA = new Modbus_TCP_PARA(); if (communication != null) { TcpParaPack = new ParaPack(communication.IO_COMM_PARASTRING); Udp_PARA.CollectFaultsInternal = Convert.ToInt32(TcpParaPack.GetValue("重试间隔")); Udp_PARA.CollectFaultsNumber = Convert.ToInt32(TcpParaPack.GetValue("重试次数")); Udp_PARA.ContinueCollect = TcpParaPack.GetValue("重试") == "1" ? true : false; Udp_PARA.LocalTCP_Port = TcpParaPack.GetValue("本地端口"); Udp_PARA.LocalTCP_IP = TcpParaPack.GetValue("本地IP"); Udp_PARA.SimulatorTCP_Port = TcpParaPack.GetValue("模拟设备端口"); Udp_PARA.SimulatorTCP_IP = TcpParaPack.GetValue("模拟设备IP"); Udp_PARA.WriteTimeout = int.Parse(TcpParaPack.GetValue("写超时时间")); Udp_PARA.ReadTimeout = int.Parse(TcpParaPack.GetValue("读超时时间")); Udp_PARA.WriteBufferSize = int.Parse(TcpParaPack.GetValue("写缓存")); Udp_PARA.ReadBufferSize = int.Parse(TcpParaPack.GetValue("读缓存")); //构造获取数据命令的字节数组,Modbus for (int i = 0; i < this.IODevices.Count; i++) { object fragment = new ModbusFragmentStore(); RealData mRealData = new RealData(); mRealData.Device = this.IODevices[i]; ScadaDeviceKernel driverDll = DeviceDrives.Find(x => x.DeviceDriverID == this.IODevices[i].DEVICE_DRIVER_ID); if (driverDll != null) { driverDll.InitKernel(IOServer, IOCommunication, this.IODevices[i], null, this.IODevices[i].DriverInfo); //IO_DEVICE_ADDRESS中存储的是DTU编号 mRealData.SlaveId = this.IODevices[i].IO_DEVICE_ADDRESS; //数据库中系统编号 mRealData.DEVICEID = this.IODevices[i].IO_DEVICE_ID; //获取下发命令的参数,注意此次要进心分段存储,因为modbus一次不能超过123个寄存器地址 //mRealData.ReadSendByte = driverDll.GetDataCommandBytes(this.IOServer, this.IOCommunication, this.IODevices[i], this.IODevices[i].IOParas, null, ref fragment); } mRealData.Fragment = (ModbusFragmentStore)fragment; RealDevices.Add(mRealData); } } return(true); }
public override void SetUIParameter(string para) { //初始化 comboSeriePort.Items.Clear(); foreach (string vPortName in SerialPort.GetPortNames()) { comboSeriePort.Items.Add(vPortName); } if (comboSeriePort.Items.Count > 0) { comboSeriePort.SelectedIndex = 0; } cbCheck.SelectedIndex = 0; cbModbusType.SelectedIndex = 0; cbStopbits.SelectedIndex = 0; base.SetUIParameter(para); ParaPack paraPack = new ParaPack(para); //串口 for (int i = 0; i < comboSeriePort.Items.Count; i++) { if (comboSeriePort.Items[i].ToString() == paraPack.GetValue("串口")) { comboSeriePort.SelectedIndex = i; break; } } //模拟器串口 for (int i = 0; i < comboSmSeriePort.Items.Count; i++) { if (comboSmSeriePort.Items[i].ToString() == paraPack.GetValue("模拟器串口")) { comboSmSeriePort.SelectedIndex = i; break; } } //波特率 cbBaudRate.Text = paraPack.GetValue("波特率"); //校验 for (int i = 0; i < cbCheck.Items.Count; i++) { if (cbCheck.Items[i].ToString() == paraPack.GetValue("校验")) { cbCheck.SelectedIndex = i; break; } } //数据位 cbDataBits.Text = paraPack.GetValue("数据位"); //停止位 for (int i = 0; i < cbStopbits.Items.Count; i++) { if (cbStopbits.Items[i].ToString() == paraPack.GetValue("停止位")) { cbStopbits.SelectedIndex = i; break; } } cbContinueCollect.Checked = paraPack.GetValue("连续采集") == "1" ? true : false; nbCollectNum.Value = Convert.ToDecimal(paraPack.GetValue("重试次数")); nbCollectInternal.Value = Convert.ToDecimal(paraPack.GetValue("重试间隔")); nbPackSize.Value = Convert.ToDecimal(paraPack.GetValue("包最大长度")); nbPackOffset.Value = Convert.ToDecimal(paraPack.GetValue("偏移间隔")); nbWriteTimeout.Value = Convert.ToDecimal(paraPack.GetValue("写超时时间")); nbReadTimeout.Value = Convert.ToDecimal(paraPack.GetValue("读超时时间")); cbRTSEnable.Checked = paraPack.GetValue("RTS") == "1" ? true : false; nbSendPreKeeyTime.Value = Convert.ToDecimal(paraPack.GetValue("发送前RTS保持时间")); nbSendAfterKeeyTime.Value = Convert.ToDecimal(paraPack.GetValue("发送后RTS保持时间")); cbSixCmd.Checked = paraPack.GetValue("支持6号命令") == "1" ? true : false; cbSixteenCmd.Checked = paraPack.GetValue("支持16号命令") == "1" ? true : false; for (int i = 0; i < cbModbusType.Items.Count; i++) { if (cbModbusType.Items[i].ToString() == paraPack.GetValue("MODBUS类型")) { cbModbusType.SelectedIndex = i; break; } } }