예제 #1
0
        static void Main(string[] args)
        {
            ModbusRTU modbusRTU = new ModbusRTU();

            try
            {
                modbusRTU.OpenCom("COM11",
                                  BaudRateEnum.BaudRate9600,
                                  System.IO.Ports.Parity.None,
                                  System.IO.Ports.StopBits.One, DataBitsEnum.DataBits8);
                Console.WriteLine("Sesscess");
                for (int i = 0; i < 100; i++)
                {
                    byte[] reuslt = modbusRTU.ReadKeepReg(17, 107, 3);
                    byte[] re     = new byte[2];
                    re[0] = reuslt[1];
                    re[1] = reuslt[0];
                    Console.WriteLine(BitConverter.ToInt16(re, 0).ToString());
                    Task.Delay(1000).Wait();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
예제 #2
0
        public void SetDataPointRealValueByFunNun16Test()
        {
            ModbusRTUServer modbusRTUServer = new ModbusRTUServer();

            modbusRTUServer.InitializeFromConfigFile(modbusConfigFile, serialPortConfigFile);
            List <DataPoint> dataPoints = new List <DataPoint>();

            modbusRTUServer.SerialPort.OnCurrentRequestDataChanged += new EventHandler <RequstDataEventArgs>(SerialPort_OnRequestDataChanged);
            modbusRTUServer.SerialPort.OnCurrentReceiveDataChanged += new EventHandler <ReceiveDataEventArgs>(SerialPort_OnReceiveDataChanged);

            dataAnalyzeMode = modbusRTUServer.DataAnalyzeMode;
            allDataPoints   = modbusRTUServer.AllDataPoints;

            dataPoints.Add(new DataPoint()
            {
                DeviceAddress        = 1,
                StartRegisterAddress = 83,
                DataPointType        = DataPointType.WriteAndReadByFunNum03,
                DataPointDataType    = DataPointDataType.F32,
                RealTimeValue        = -1,
                ValueToSet           = 101.7
            });

            List <List <byte> > writeRegisterCommandBytes = ModbusRTU.CreateWriteRegisterCommands(DataAnalyzeMode.DataHighToLow, dataPoints);

            if (modbusRTUServer.SerialPort.TryOpenSerialPort())
            {
                foreach (var writeBytes in writeRegisterCommandBytes)
                {
                    modbusRTUServer.SerialPort.WriteSerialPort(writeBytes.ToArray());
                }
            }
        }
예제 #3
0
        private void Button_MouseClick(object sender, MouseEventArgs e)
        {
            this.PeriodicRefreshTimer.Enabled = false;
            ModbusRTU.SuspendRead((byte)_ReadFunctionCode, _ReadAddress, _ReadDataLengthInBit);//鼠标单击本控件后,进入写寄存器状态,暂停寄存器的读操作

            switch (_ButtonClickAction)
            {
            case ModbusButtonClickActionEnum.Set:
                ModbusRTU.MasterDataRepos.Coils[_WriteAddress] = true;
                break;

            case ModbusButtonClickActionEnum.Reset:
                ModbusRTU.MasterDataRepos.Coils[_WriteAddress] = false;
                break;

            case ModbusButtonClickActionEnum.Toggle:
                ModbusRTU.MasterDataRepos.Coils[_WriteAddress] = !ModbusRTU.MasterDataRepos.Coils[_WriteAddress];
                break;

            default:
                break;
            }
            ModbusRTU.VoteToConfirmTransmitRegs('+', (byte)_WriteFunctionCode, _WriteAddress, _WriteDataLengthInBit);
            ModbusRTU.AssembleRequestADU(1, ModbusRTU.LoadUnmannedBuses((byte)_WriteFunctionCode, 0));
            ModbusRTU.ResumeRead((byte)_ReadFunctionCode, _ReadAddress, _ReadDataLengthInBit);//鼠标单击本控件后,进入写寄存器状态,暂停寄存器的读操作
            PeriodicRefreshTimer.Enabled = true;
        }
예제 #4
0
 public BitStatus_ModbusRTU()
 {
     InitializeComponent();
     this.BorderStyle              = BorderStyle.FixedSingle;
     PeriodicRefreshTimer.Elapsed += PeriodicRefreshTimer_Elapsed;
     ModbusRTU.VoteToConfirmTransmitRegs('+', (byte)_ReadFunctionCode, _ReadAddress, _ReadDataLengthInBit);//控件初始化时,票决器根据地址值自动加1,并判断票选结果
 }
        public void InitializeModbusRtu(SerialPort serialPort)
        {
            this.serialPort = serialPort;
            this.modbusRtu  = new ModbusRTU(serialPort);

            this.modbusRtu.OnCurrentRequestDataChanged += new EventHandler <RequstDataEventArgs>(ModbusRtu_OnRequestDataChanged);
            this.modbusRtu.OnCurrentReceiveDataChanged += new EventHandler <ReceiveDataEventArgs>(ModbusRtu_OnReceiveDataChanged);
        }
예제 #6
0
 public Button_ModbusRTU()
 {
     InitializeComponent();
     PeriodicRefreshTimer.Elapsed += PeriodicRefreshTimer_Elapsed;
     PeriodicRefreshTimer.Enabled  = true;
     this.MouseClick += Button_MouseClick;
     ModbusRTU.VoteToConfirmTransmitRegs('+', (byte)_ReadFunctionCode, _ReadAddress, _ReadDataLengthInBit);//控件初始化时,票决器根据地址值自动加1,并判断票选结果
 }
예제 #7
0
        public Textbox_ModbusRTU()
        {
            PeriodicRefreshTimer.Elapsed += PeriodicRefreshTimer_Elapsed;
            this.MouseClick += ModbusView_MouseClick1;
            this.KeyPress   += ModbusView_KeyPress;

            ModbusRTU.VoteToConfirmTransmitRegs('+', (byte)_ReadFunctionCode, _ReadAddress, _ReadDataLengthInWord);//控件初始化时,票决器根据地址值自动加1,并判断票选结果
        }
예제 #8
0
        public Form1()
        {
            InitializeComponent();
            OpenCmdBytes.Add(new byte[8] {
                0x01, 0x05, 0x00, 0x00, 0xFF, 0x00, 0x8C, 0x3A
            });                                                                                //1
            OpenCmdBytes.Add(new byte[8] {
                0x01, 0x05, 0x00, 0x01, 0xFF, 0x00, 0xDD, 0xFA
            });                                                                                //2
            OpenCmdBytes.Add(new byte[8] {
                0x01, 0x05, 0x00, 0x02, 0xFF, 0x00, 0x2D, 0xFA
            });                                                                                //3
            OpenCmdBytes.Add(new byte[8] {
                0x01, 0x05, 0x00, 0x03, 0xFF, 0x00, 0x7C, 0x3A
            });                                                                                //4
            OpenCmdBytes.Add(new byte[8] {
                0x01, 0x05, 0x00, 0x04, 0xFF, 0x00, 0xCD, 0xFB
            });                                                                                //5
            OpenCmdBytes.Add(new byte[8] {
                0x01, 0x05, 0x00, 0x05, 0xFF, 0x00, 0x9C, 0x3B
            });                                                                                //6
            OpenCmdBytes.Add(new byte[8] {
                0x01, 0x05, 0x00, 0x06, 0xFF, 0x00, 0x6C, 0x3B
            });                                                                                //7
            OpenCmdBytes.Add(new byte[8] {
                0x01, 0x05, 0x00, 0x07, 0xFF, 0x00, 0x3D, 0xFB
            });                                                                                //8

            CloseCmdBytes.Add(new byte[8] {
                0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCA
            });                                                                                 //1
            CloseCmdBytes.Add(new byte[8] {
                0x01, 0x05, 0x00, 0x01, 0x00, 0x00, 0x9C, 0x0A
            });                                                                                 //2
            CloseCmdBytes.Add(new byte[8] {
                0x01, 0x05, 0x00, 0x02, 0x00, 0x00, 0x6C, 0x0A
            });                                                                                 //3
            CloseCmdBytes.Add(new byte[8] {
                0x01, 0x05, 0x00, 0x03, 0x00, 0x00, 0x3D, 0xCA
            });                                                                                 //4
            CloseCmdBytes.Add(new byte[8] {
                0x01, 0x05, 0x00, 0x04, 0x00, 0x00, 0x8C, 0x0B
            });                                                                                 //5
            CloseCmdBytes.Add(new byte[8] {
                0x01, 0x05, 0x00, 0x05, 0x00, 0x00, 0xDD, 0xCB
            });                                                                                 //6
            CloseCmdBytes.Add(new byte[8] {
                0x01, 0x05, 0x00, 0x06, 0x00, 0x00, 0x2D, 0xCB
            });                                                                                 //7
            CloseCmdBytes.Add(new byte[8] {
                0x01, 0x05, 0x00, 0x07, 0x00, 0x00, 0x7C, 0x0B
            });                                                                                 //8

            serialPort2  = new SerialPort2(socketControl);
            ModbusMaster = new ModbusRTU(serialPort2, ModbusRTUmode.Master);
        }
예제 #9
0
        private void buttonOpenClose_Click(object sender, EventArgs e)
        {
            try
            {
                this.Invoke((EventHandler)(delegate
                {
                    //根据当前串口对象,来判断操作
                    if (comm.IsOpen)
                    {
                        this.CommClosing = true;
                        while (this.CommListening)
                        {
                            Application.DoEvents(); //【防止关闭串口时卡死在close()时用到】
                        }
                        comm.Close();               //打开时点击,则关闭串口
                        this.CommClosing = false;
                    }
                    else
                    {
                        if (buttonConnect.Text == "断开")
                        {
                            buttonConnet_Click(this.buttonConnect, new EventArgs());
                        }

                        //关闭时点击,则设置好端口,波特率后打开
                        try
                        {
                            comm.PortName = comboPortName.Text;
                            comm.BaudRate = int.Parse(comboBaudrate.Text);
                            comm.Parity = Parity.None;
                            comm.Open();
                            comm.Read(new byte[comm.BytesToRead], 0, comm.BytesToRead);//把缓冲区的数据全部清除

                            this.ModbusMaster = new ModbusRTU(comm, ModbusRTUmode.Master);
                        }
                        catch (Exception ex)
                        {
                            //捕获到异常信息,创建一个新的comm对象,之前的不能用了。
                            comm = new SerialPort();
                            //现实异常信息给客户。
                            MessageBox.Show("打开串口时出现如下异常:\r\n\r\n" + ex.Message);
                        }
                    }
                    //设置按钮的状态
                    buttonOpenClose.Text = comm.IsOpen ? "关闭串口" : "打开串口";
                }));
            }
            catch (Exception ex2)
            {
                MessageBox.Show(ex2.ToString());
            }
        }
예제 #10
0
        private void InitializeModbusRTU()
        {
            this.serialPort          = new SerialPort();
            this.serialPort.PortName = this.cbPorts.Text as string;//this.serialPort.PortName = this.cbPorts.SelectedItem as string;
            this.serialPort.BaudRate = (int)this.cbBaudRate.SelectedItem;
            this.serialPort.Parity   = (Parity)Enum.Parse(typeof(Parity), (string)this.cbParity.SelectedItem, false);
            this.serialPort.DataBits = (int)this.cbDataBits.SelectedItem;
            this.serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), (string)this.cbStopBit.SelectedItem);

            this.modbusRTU = new ModbusRTU(serialPort);
            this.modbusRTU.OnCurrentRequestDataChanged += new EventHandler <RequstDataEventArgs>(modbusRTU_OnRequestDataChanged);
            this.modbusRTU.OnCurrentReceiveDataChanged += new EventHandler <ReceiveDataEventArgs>(modbusRTU_OnReceiveDataChanged);
        }
예제 #11
0
 public void ReadKeepRegTest()
 {
     Modbus.ModbusRTU modbusRTU = new ModbusRTU();
     modbusRTU.OpenCom("COM11",
                       BaudRateEnum.BaudRate9600,
                       System.IO.Ports.Parity.None,
                       System.IO.Ports.StopBits.None, DataBitsEnum.DataBits8);
     byte[] reuslt = modbusRTU.ReadKeepReg(17, 107, 3);
     byte[] re     = new byte[2];
     re[0] = reuslt[1];
     re[1] = reuslt[0];
     string s = BitConverter.ToInt16(re, 0).ToString();
 }
예제 #12
0
        public MainForm()
        {
            InitializeComponent();
            WorkSpcaeSystemInfoForm.MdiParent = this;
            WorkSpcaeFaultInfoForm.MdiParent  = this;
            WorkSpcaeWaveformForm.MdiParent   = this;
            WorkSpaceWorkModeForm.MdiParent   = this;

            treeView1.ExpandAll();

            ModbusRTU.IsMaster = true;
            ModbusRTU.AssembleRequestADU(1, ModbusRTU.LoadUnmannedBuses((byte)ModbusRTU.ModbusFuncCode.ReadStorageRegs, 8));
            ModbusRTU.AssembleRequestADU(1, ModbusRTU.LoadUnmannedBuses((byte)ModbusRTU.ModbusFuncCode.ReadInputRegs, 8));
            ModbusRTU.AssembleRequestADU(1, ModbusRTU.LoadUnmannedBuses((byte)ModbusRTU.ModbusFuncCode.ReadCoils, 8));
        }
예제 #13
0
        private void SerialPort_OnReceiveDataChanged(object sender, ReceiveDataEventArgs e)
        {
            List <byte> recevideData = e.ReceiveData;

            this.canSendNextRequestCommandBytes = true;

            if (null != recevideData)
            {
                this.currentRecivedByteData = recevideData;
                AnalyzeRecivedDataReponse reponse = ModbusRTU.AnalyzeRecivedDataStatic(this.dataAnalyzeMode, this.currentRequestByteData, recevideData);
                if (reponse.ModbusReponseSuccess && reponse.AnalyzeRecivedDataSuccess)
                {
                    var dataPointsWhoseRealTimeDataChanged = ModbusRTU.SetDataPointValueFromRegisterValue(reponse.Registers, this.allDataPoints);
                }
            }
        }
예제 #14
0
        private List <ReadRegisterCommand> GetReadRegisterCommands(List <DataPoint> dataPoints)
        {
            List <ReadRegisterCommand> readRegisterCommands = new List <ReadRegisterCommand>();

            List <List <byte> > requestBytes = ModbusRTU.CreateReadRegisterCommands(dataPoints);

            foreach (var requestByte in requestBytes)
            {
                var readRegisterCommand = new ReadRegisterCommand();
                readRegisterCommand.ReadCommand = requestByte;

                readRegisterCommands.Add(readRegisterCommand);
            }

            return(readRegisterCommands);
        }
예제 #15
0
        private void buttonConnet_Click(object sender, EventArgs e)
        {
            if (buttonConnect.Text == "连接")
            {
                if (comm.IsOpen)
                {
                    this.buttonOpenClose_Click(this.buttonOpenClose, new EventArgs());
                }

                toolStripStatusLabel1.Text = "正在连接中……";

                IPAddress  ips = IPAddress.Parse(this.textBoxIPAddress.Text);                 //("192.168.2.1");
                IPEndPoint ipe = new IPEndPoint(ips, Convert.ToInt32(this.textBoxPort.Text)); //把ip和端口转化为IPEndPoint实例
                socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                try
                {
                    socketControl.Connect(ipe);//连接到服务器
                    toolStripStatusLabel1.Text = "";
                    MessageBox.Show("连接成功");
                    serialPort2  = new SerialPort2(socketControl);
                    ModbusMaster = new ModbusRTU(serialPort2, ModbusRTUmode.Master);

                    ModbusMaster.DeviceAddress = ACU_Address;

                    th = new Thread(ReceiveMsg);
                    th.IsBackground = true;
                    th.Start();
                    buttonConnect.Text = "断开";
                }
                catch (Exception ex)
                {
                    toolStripStatusLabel1.Text = "";
                    MessageBox.Show(ex.Message);
                }
            }
            else if (buttonConnect.Text == "断开")
            {
                toolStripStatusLabel1.Text = "正在断开连接……";
                th.Abort();

                socketControl.Close();

                buttonConnect.Text         = "连接";
                toolStripStatusLabel1.Text = "";
            }
        }
예제 #16
0
        private void ModbusView_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Enter)                                                                     //如果按下了Enter键,则进入发数据状态
            {
                if (UInt16.TryParse(this.Text, out ModbusRTU.MasterDataRepos.StorageRegs[_WriteAddress]) == false) //TryParse 函数如果判断出所转换的字符串与所对应的数据格式不对应,会以0值out出来
                {
                    this.Text = "Wrong Input";
                    return;
                }
                ; // 需要改进,增加容错能力  考虑使用uint16.tryparse()

                ModbusRTU.VoteToConfirmTransmitRegs('+', (byte)_WriteFunctionCode, _WriteAddress, _WriteDataLengthInWord);
                ModbusRTU.AssembleRequestADU(1, ModbusRTU.LoadUnmannedBuses((byte)_WriteFunctionCode, 0));
                HideCaret(this.Handle);
                PeriodicRefreshTimer.Enabled = true;
            }

            if (e.KeyChar == (char)Keys.Escape)//通过Esc键取消写操作,恢复周期性读数据状态
            {
                ModbusRTU.ResumeRead((byte)_ReadFunctionCode, _ReadAddress, _ReadDataLengthInWord);
                HideCaret(this.Handle);
                PeriodicRefreshTimer.Enabled = true;
            }
        }
예제 #17
0
 public Label_ModbusRTU()
 {
     InitializeComponent();
     PeriodicRefreshTimer.Elapsed += PeriodicRefreshTimer_Elapsed;
     ModbusRTU.VoteToConfirmTransmitRegs('+', (byte)_ReadFunctionCode, _ReadAddress, _ReadDataLengthInWord);//控件初始化时,票决器根据地址值自动加1,并判断票选结果
 }
        public FormSensor(ModbusRTU master)
        {
            InitializeComponent();

            Master = master;
        }
예제 #19
0
 private void ModbusView_MouseClick1(object sender, MouseEventArgs e)
 {
     this.PeriodicRefreshTimer.Enabled = false;
     ShowCaret(this.Handle);
     ModbusRTU.SuspendRead((byte)_ReadFunctionCode, _ReadAddress, _ReadDataLengthInWord);//鼠标单击本控件后,进入写寄存器状态,暂停寄存器的读操作
 }
        public FormRelayConfiguration(ModbusRTU master)
        {
            InitializeComponent();

            Master = master;
        }