Вывод ответа с устройства по протоколу modbus RTU C#

356
20 июля 2018, 21:00

Столкнулся с проблемой: необходимо считывать данные с устройств по протоколу modbus. Я не могу понять, как получить ответ от устройства.

Я вызываю свою функцию, но как мне получить данные с устройства? Может, кто-то может помочь.

P.S. Готовые библиотеки типа nmodbus, я использовал, но хочу разобраться как это сделать самому.

static void Main(string[] args)
    {
        //Connection comPort = new Connection("COM6", 19200, 8);
        //comPort.readHoldingCom(2, 0x600, 16);
        //comPort.writeHoldingCom(2, 0x44E, 0x0100);
        //Connection portTCP = new Connection("192.168.127.12", 4001);
        //portTCP.readHoldingTcp(2, 0x600, 16);
        var serial = new SerialPort("COM6", 19200);
        serial.Handshake = Handshake.None;
        serial.Parity = Parity.None;
        serial.DataBits = 8;
        serial.StopBits = StopBits.One;
        serial.Open();
        serial.Write(ReadHoldingRegister(2, 1024, 16), 0, 8);
        ReadReponse(serial);
        serial.Close();
        Console.ReadLine();
    }
    static void ReadReponse(SerialPort serial)
    {
        Console.WriteLine("Чтение ответа...");
        var byteBuffer = GetData(serial);
        var firstRegValue = CreateRegValue(byteBuffer[3], byteBuffer[4]);
        Console.WriteLine(firstRegValue);
        var secondRegValue = CreateRegValue(byteBuffer[5], byteBuffer[6]);
        Console.WriteLine(secondRegValue);
        Console.ReadKey();
    }
    static Int16 CreateRegValue(byte hiByte, byte lowByte)
    {
        return (Int16)(hiByte << 8 | lowByte);
    }
    static byte[] GetData(SerialPort serial)
    {
        int offset = 0;
        var byteBuffer = new byte[9];
        while (offset < 9)
        {
            offset += serial.Read(ReadHoldingRegister(2, 1024, 16), 0, 8);
        }
        return byteBuffer;
    }
    #region Function 3
    public static byte[] ReadHoldingRegister(int id, int startAddress, int length)
    {
        byte[] data = new byte[8];
        byte High, Low;
        data[0] = Convert.ToByte(id);
        data[1] = Convert.ToByte(3);
        byte[] _adr = BitConverter.GetBytes(startAddress - 1);
        data[2] = _adr[1];
        data[3] = _adr[0];
        byte[] _length = BitConverter.GetBytes(length);
        data[4] = _length[1];
        data[5] = _length[0];
        myCRC(data, 6, out High, out Low);
        data[6] = Low;
        data[7] = High;
        return data;
    }
    #endregion
    #region CRC
    public static void myCRC(byte[] message, int length, out byte CRCHigh, out byte CRCLow)
    {
        ushort CRCFull = 0xFFFF;
        for (int i = 0; i < length; i++)
        {
            CRCFull = (ushort)(CRCFull ^ message[i]);
            for (int j = 0; j < 8; j++)
            {
                if ((CRCFull & 0x0001) == 0)
                    CRCFull = (ushort)(CRCFull >> 1);
                else
                {
                    CRCFull = (ushort)((CRCFull >> 1) ^ 0xA001);
                }
            }
        }
        CRCHigh = (byte)((CRCFull >> 8) & 0xFF);
        CRCLow = (byte)(CRCFull & 0xFF);
    }
    #endregion
}
READ ALSO
Путь к картинке в MySQL

Путь к картинке в MySQL

При передачи строки расположения картинки убираются слеши (\);

165
C# Баг progress bar.

C# Баг progress bar.

имеем небольшой кусок кода, который по клику на кнопку вызывает cmd, и в ней исполняет apache benchНадо показать прогресс бар

190
Блок catch не выполняется

Блок catch не выполняется

Выполняю удаленную отладку сайта, который находится на веб-сервере IIS

174
UploadFile Telegram bot API

UploadFile Telegram bot API

Как я могу загрузить файл через WebClientUploadFile на сервера Telegram? И потом отправить его пользователю?

426