#region Function 3 - Read Registers
        public bool SendFc3(byte address, ushort start, ushort registers, ref short[] values)
        {
            //Ensure port is open:
            if (serialPort.IsOpen)
            {
                //Clear in/out buffers:
                serialPort.DiscardOutBuffer();
                serialPort.DiscardInBuffer();
                //Function 3 request is always 8 bytes:
                if (MyGlobals.serial_mode == MyGlobals.MODBUS_RTU)
                {
                    byte[] message = new byte[1 + 1 + 2 + 2 + 2];
                    byte[] response = new byte[1 + 1 + 1 + (2 * registers) + 2];
                    //Build outgoing modbus message:
                    BuildMessage(address, (byte)3, start, registers, ref message);
                    try
                    {
                        serialPort.Write(message, 0, message.Length);
                        GetResponse(ref response);
                    }
                    catch (Exception err)
                    {
                        modbusStatus = "Error in read event: " + err.Message;
                        return false;
                    }
                    if (CheckResponse(response))
                    {
                        //Return requested register values:
                        for (int i = 0; i < (response.Length - 5) / 2; i++)
                        {
                            values[i] = response[2 * i + 3];
                            values[i] <<= 8;
                            values[i] += response[2 * i + 4];
                        }
                        modbusStatus = "Read successful";
                        return true;
                    }
                    else
                    {
                        modbusStatus = "CRC error";
                        return false;
                    }
                }
                else
                {
                    modbusStatus = "CRC error";
                    return false;
                }
            }
            else
            {
                modbusStatus = "Serial port not open";
                return false;
            }
        }
        #endregion

여기선 사전 검사 를 하는거라고 생각하면 된다

사이즈를 만들고 이제 밑에 빌드 메세지로 간다

 #region Build Message
        public void BuildMessage(byte address, byte type, ushort start, ushort registers, ref byte[] message)
        {
            //Array to receive CRC bytes:
            byte[] CRC = new byte[2];
            byte[] message2 = new byte[20];
            message2 = null;
            
            if (MyGlobals.serial_mode == MyGlobals.MODBUS_RTU)
            {
                message[0] = address;
                message[1] = type;
                message[2] = (byte)(start >> 8);
                message[3] = (byte)start;
                message[4] = (byte)(registers >> 8);
                message[5] = (byte)registers;

                GetCRC(message, ref CRC);
                message[message.Length - 2] = CRC[0];
                message[message.Length - 1] = CRC[1];
            }
            else   //Ascii - FC3
            {
            }
            send_message = null;
            for (int i = 0; i < message.Length; i++)
            {
                send_message += message[i] + " ";
            }
            //send_message+= null;
        }
        #endregion

빈 메세지를 받고 기에 값을 넣기 시작한다 

'[ 충남인력개발원 ] (2019) > ┗C#' 카테고리의 다른 글

8일차 모스키토 사용  (0) 2020.04.16
6일차 C#과 ModBus  (0) 2020.04.13
3일차 코드 모두버스의 대하여  (0) 2020.04.08
2일차 코드??  (0) 2020.04.07
1일차 C# 윈폼 EXCEL 데이터 컴파일  (0) 2020.02.24
블로그 이미지

Or71nH

,