示例#1
0
        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;
            }
        }
示例#2
0
        public override string GetUIParameter()
        {
            ParaPack paraPack = new ParaPack();

            paraPack.AddItem("内存区", cbo_functioncode);
            paraPack.AddItem("偏置", ndOffset);
            paraPack.AddItem("数据类型", cbo_StoreType);
            paraPack.AddItem("存储位置", cbo_datatype);
            paraPack.AddItem("字节长度", ndCharSize);
            paraPack.AddItem("按位存取", cbPosition);
            paraPack.AddItem("数据位", ndPosition);
            if (rb_rw.Checked)
            {
                paraPack.AddItem("读写状态", "可读可写");
            }
            if (rb_r.Checked)
            {
                paraPack.AddItem("读写状态", "可读");
            }
            if (rb_w.Checked)
            {
                paraPack.AddItem("读写状态", "可写");
            }
            return(paraPack.ToString());
        }
示例#3
0
        public override string GetUIParameter()
        {
            ParaPack paraPack = new ParaPack();

            paraPack.AddItem("串口", comboSeriePort.SelectedItem.ToString());
            paraPack.AddItem("模拟器串口", comboSmSeriePort.SelectedItem.ToString());

            paraPack.AddItem("波特率", cbBaudRate.Text);
            paraPack.AddItem("数据位", cbDataBits.Text);
            paraPack.AddItem("校验", cbCheck.SelectedItem.ToString());
            paraPack.AddItem("停止位", cbStopbits.SelectedItem.ToString());
            paraPack.AddItem("连续采集", cbContinueCollect.Checked?"1":"0");
            paraPack.AddItem("重试次数", nbCollectNum.Value.ToString("0"));
            paraPack.AddItem("重试间隔", nbCollectInternal.Value.ToString("0"));
            paraPack.AddItem("包最大长度", nbPackSize.Value.ToString("0"));
            paraPack.AddItem("偏移间隔", nbPackOffset.Value.ToString("0"));
            paraPack.AddItem("写超时时间", nbWriteTimeout.Value.ToString("0"));
            paraPack.AddItem("读超时时间", nbReadTimeout.Value.ToString("0"));
            paraPack.AddItem("RTS", cbRTSEnable.Checked ? "1" : "0");
            paraPack.AddItem("发送前RTS保持时间", nbSendPreKeeyTime.Value.ToString("0"));
            paraPack.AddItem("发送后RTS保持时间", nbSendAfterKeeyTime.Value.ToString("0"));
            paraPack.AddItem("支持6号命令", cbSixCmd.Checked ? "1" : "0");
            paraPack.AddItem("支持16号命令", cbSixteenCmd.Checked ? "1" : "0");
            paraPack.AddItem("MODBUS类型", cbModbusType.SelectedItem.ToString());
            return(paraPack.ToString());
        }
示例#4
0
        public string GetParament()
        {
            ParaPack para = new ParaPack();

            if (cbo_functioncode.SelectedItem != null)
            {
                ModbusFunctionCode funCode = (ModbusFunctionCode)cbo_functioncode.SelectedItem;
                para.AddItem("内存区", funCode.Code);
            }
            para.AddItem("偏置", this.ndOffset.Text.Trim());
            if (cbo_StoreType.SelectedItem != null)
            {
                ModbusDataType datatype = (ModbusDataType)cbo_StoreType.SelectedItem;
                para.AddItem("数据类型", datatype.DataType.ToString());
            }
            if (cbo_datatype.SelectedItem != null)
            {
                string datatype = (string)cbo_datatype.SelectedItem;
                para.AddItem("存储位置", datatype.ToString());
            }
            para.AddItem("字节长度", this.ndCharSize.Text.Trim() == ""?"0": this.ndCharSize.Text.Trim());
            para.AddItem("按位存取", this.cbPosition.Checked?"1":"0");
            para.AddItem("数据位", this.ndPosition.Text.Trim() == ""?"0": this.ndPosition.Text.Trim());

            return(para.ToString());
        }
示例#5
0
        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);
        }
示例#6
0
        public string GetParament()
        {
            ParaPack para = new ParaPack();

            para.AddItem("IO标识", tb_JsonName.Text);
            para.AddItem("时间值索引", nudTime.Value.ToString("0"));
            para.AddItem("数据类型", cbDataType.SelectedItem.ToString());
            para.AddItem("采集值索引", nud_valueIndex.Text);
            para.AddItem("命令默认值", tbCmdValue.Text);
            return(para.ToString());
        }
示例#7
0
        //由于此处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);
        }
示例#8
0
        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("开启心跳"));
        }
示例#9
0
        private string GetParament()
        {
            ParaPack para = new ParaPack();

            para.AddItem("设备ID编码", this.Device.IO_DEVICE_ADDRESS);
            para.AddItem("MQTT连接ID号", this.tb_MqttID.Text.Trim());
            para.AddItem("数据订阅主题", this.tb_subTopic.Text.Trim());
            para.AddItem("下置命令主题", this.tb_cmdSubTopic.Text.Trim());
            para.AddItem("循环周期主题", this.tbTimes.Text.Trim());
            para.AddItem("主动请求主题", this.tbRecieveType.Text.Trim());

            return(para.ToString());
        }
示例#10
0
        private string GetParament()
        {
            ParaPack para = new ParaPack();

            para.AddItem("设备识别号", this.Device.IO_DEVICE_ADDRESS);
            para.AddItem("版本号", this.tb_devVersion.Text);
            para.AddItem("软件版本", this.tb_devSoftVision.Text);
            para.AddItem("硬件版本", this.tb_devHardVersion.Text);
            para.AddItem("MQTT连接ID号", this.tb_MqttID.Text);
            para.AddItem("订阅主题", this.tb_subTopic.Text);
            para.AddItem("命令主题", this.tb_cmdSubTopic.Text);
            para.AddItem("时间主题", this.tbTimes.Text);
            return(para.ToString());
        }
示例#11
0
        public string GetParament()
        {
            ParaPack para = new ParaPack();

            para.AddItem("JSON名称", tb_JsonName.Text);
            para.AddItem("版子地址", nud_boardAddress.Value.ToString("0"));
            para.AddItem("版子索引号", nud_boardIndex.Value.ToString("0"));
            para.AddItem("端口号", nud_port.Value.ToString("0"));
            para.AddItem("端口索引号", nud_PortIndex.Value.ToString("0"));
            para.AddItem("数据类型", cb_DataType.SelectedItem.ToString());
            para.AddItem("采集值索引号", nud_valueIndex.Value.ToString());
            para.AddItem("是否命令参数", cbParaType.SelectedItem.ToString());
            return(para.ToString());
        }
示例#12
0
        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);
        }
示例#13
0
 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;
 }
示例#14
0
        public override string GetUIParameter()
        {
            ParaPack paraPack = new ParaPack();

            paraPack.AddItem("本机IP", txtIP);
            paraPack.AddItem("本机端口", nudPort);
            paraPack.AddItem("注册包", cbRegisterType);
            paraPack.AddItem("标识长度", nudIdLength);
            paraPack.AddItem("存储方式", cbIdStoredType);
            paraPack.AddItem("接收方式", cbReceiveType);
            paraPack.AddItem("心跳字节", tbHeartbear);
            paraPack.AddItem("开启心跳", cbHeart);
            return(paraPack.ToString());
        }
示例#15
0
        /// <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);
        }
示例#16
0
        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("重试间隔"));
        }
示例#17
0
        public override string GetUIParameter()
        {
            ParaPack paraPack = new ParaPack();

            paraPack.AddItem("注册标识", tbIdentification);
            paraPack.AddItem("设备地址", txtAddress);
            paraPack.AddItem("Modbus类型", cbModbusType);
            paraPack.AddItem("读超时", nbReadTimeout);
            paraPack.AddItem("写超时", nbWriteTimeout);
            paraPack.AddItem("读缓存", ndReadBuffSize);
            paraPack.AddItem("写缓存", ndWriteBufferSize);
            paraPack.AddItem("失败重试", cbRetries);
            paraPack.AddItem("重试次数", ndRetiresNum);
            paraPack.AddItem("重试间隔", nbRetiresInternal);
            return(base.GetUIParameter());
        }
示例#18
0
        public override string GetUIParameter()
        {
            ParaPack paraPack = new ParaPack();

            paraPack.AddItem("模拟设备IP", tbSMDeviceIP.Text);
            paraPack.AddItem("模拟设备端口", ndSMPort.Text);
            paraPack.AddItem("本地IP", tbLocalIP.Text);
            paraPack.AddItem("本地端口", ndLocalPort.Text);
            paraPack.AddItem("重试", cbRetries.Checked?"1":"0");
            paraPack.AddItem("重试次数", ndRetiresNum.Text);
            paraPack.AddItem("重试间隔", nbRetiresInternal.Text.ToString());
            paraPack.AddItem("写超时时间", nbWriteTimeout.Text);
            paraPack.AddItem("读超时时间", nbReadTimeout.Text);
            paraPack.AddItem("读缓存", ndReadBuffSize.Text);
            paraPack.AddItem("写缓存", ndWriteBufferSize.Text);
            return(paraPack.ToString());
        }
示例#19
0
        private string GetParament()
        {
            ParaPack para = new ParaPack();

            para.AddItem("服务器IP", txtIp.Text);
            para.AddItem("端口号", nudPort.Value.ToString("0"));
            para.AddItem("用户名", tbUser.Text);
            para.AddItem("密码", tbPwd.Text);
            para.AddItem("开启匿名验证", cbEnableUser.Checked.ToString());
            para.AddItem("心跳时间", tbHeart.Text.ToString());
            para.AddItem("消息质量", cbMessage.SelectedItem.ToString());
            para.AddItem("遗愿标志", cbWill.SelectedItem.ToString());
            para.AddItem("数据格式", cbDataType.SelectedItem.ToString());
            para.AddItem("开启Mqtt客户端识别", cbClientIDEnable.Checked.ToString());
            para.AddItem("接收方式", cbReceiveMethod.SelectedItem.ToString());
            return(para.ToString());
        }
示例#20
0
 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;
 }
示例#21
0
        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;
            }
        }
示例#22
0
        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("写缓存"));
        }
示例#23
0
        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;
        }
示例#24
0
        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);
        }
示例#25
0
        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;
        }
示例#26
0
        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);
            }
        }
示例#27
0
        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);
            }
        }
示例#28
0
        /// <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);
        }
示例#29
0
        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);
        }
示例#30
0
        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 + "启动服务");
        }