コード例 #1
0
ファイル: OutFunctions.cs プロジェクト: tomakor549/Modbus
        public FrameMainData returnFrameData(string message, byte stationAdress)
        {
            if (message.Length > 9)
            {
                if (string.IsNullOrEmpty(message) || message[0] != ':')
                {
                    return(null);
                }

                byte adress = byte.Parse(message.Substring(1, 2), NumberStyles.HexNumber);
                if (adress != (byte)0)
                {
                    if (stationAdress != adress)
                    {
                        return(null);
                    }
                }

                byte code = byte.Parse(message.Substring(3, 2), NumberStyles.HexNumber);
                byte lrc  = byte.Parse(message.Substring(message.Length - 4, 2), NumberStyles.HexNumber);

                string msg = message.Substring(5, message.Length - 5 - 4);
                if (lrc != convertLRC((byte)adress, (byte)code, hexToString(msg)))
                {
                    return(null);
                }


                FrameMainData frameMainData = new FrameMainData(adress, code, msg);
                return(frameMainData);
            }

            return(null);
        }
コード例 #2
0
ファイル: OutFunctions.cs プロジェクト: tomakor549/Modbus
 public FrameMainData(FrameMainData data)
 {
     adress = data.adress;
     code   = data.code;
     msg    = data.msg;
 }
コード例 #3
0
        public void slaveReceive()
        {
            string frameRcv;

            frameTime.Restart();    //odliczamy czas wczytywania ramki

            //wczytanie lini z serial portu do napotkania \n bez wczytania \n
            string msg = frameRcv = serialPort.ReadLine() + "\r\n"; //\n dodajemy ręcznie, żeby data.Length nie był 0

            frameTime.Stop();                                       //zatrzymujemy odliczanie wczytywania ramki

            /*frameTime zwracamy w milisekundach i przeliczamy na ile milisekund przypada 1 znak z wczytanej ramki
             * po czym sprawdzamy czy nie przekracza ograniczeniea czasowego na odstęp pomiędzy znakami ramki*/
            if (frameTime.ElapsedMilliseconds / msg.Length > Convert.ToInt32(frameSpace))
            {
                MessageBox.Show("Przekroczono ograniczenie czasowe na odstęp pomiędzi znakami ramki");
                return;
            }

            FrameMainData frameData = outFunctions.returnFrameData(msg, slaveStationAdress);

            if (frameData == null)
            {
                return;
            }

            if (frameData.adress == 0)
            {
                slaveReceiveTxt(msg);
                return;
            }
            else
            {
                if (slaveStationAdress != frameData.adress)
                {
                    return;
                }
                else
                {
                    if (frameData.code == (byte)1)
                    {
                        if (richTextBoxMasterReceiveFrame.InvokeRequired)
                        {
                            Action act = () => richTextBoxMasterReceiveFrame.Text += frameRcv;

                            Invoke(act);   //wywołanie delegata
                        }
                        else
                        {
                            richTextBoxMasterReceiveFrame.Text += frameRcv;
                        }

                        slaveReceiveTxt(msg);
                    }
                    else
                    if (frameData.code == (byte)2)
                    {
                        sendSlaveFrame();
                    }
                    else
                    {
                        MessageBox.Show("Zła wartość rozkazu");
                    }
                }
            }
        }