в общем я на шарпе чуток работал. я собственно работал с tcp modbus. писал сам без библиотек.
это справедливо для 3, 4 и 6 функций и только для данных word. для данных dword и float нужно удвоить количество считываемых регистров и записываемых соответственно. 6 функция это запись одного регистра хранения. вместо количества считываемых регистров пишем в регистрКод:
//Сообщение для инициализации чтения чтение регистра функция 3 или 4 (4 функция работает только на чтение проверялось с целыми числами)
ushort startAddress = 0;
short length = 6;
short id = 1;
byte[] msg = new byte[12];
byte[] _id = BitConverter.GetBytes((ushort)id);
msg[0] = _id[1]; // я так понял
msg[1] = _id[0]; // это идентификатор сообщения слейв присылает его обратно в том же виде
msg[2] = 0; // на данный момент не используется по описанию протокола
msg[3] = 0; // на данный момент не используется по описанию протокола
msg[4] = 0; // длинна сообщения протокола модбас т.е то что следует после этого байта
msg[5] = 6; // длинна сообщения протокола модбас т.е то что следует после этого байта
msg[6] = 1; // адрес слейв как в модбас рту
msg[7] = 4; // код функции 3 или 4 для чтения. 6 код для записи
byte[] _adr = BitConverter.GetBytes((short)startAddress);
msg[8] = _adr[1]; // адрес регистра
msg[9] = _adr[0]; // для чтения
byte[] _length = BitConverter.GetBytes(length);
msg[10] = _length[1]; // количество регистров
msg[11] = _length[0]; // для чтения
msg[10] = _length[1]; // данные которые надо записать
msg[11] = _length[0]; // данные которые надо записать
Функции множественного чтения записи и чтение записи битов не делал тк не нужно. в ближайшем плане это. писал сам с 0 для своего развития и ради интереса.
для сериал порта это будет выглядеть практически также
msg[0] // адрес слейв
msg[1] // код функции
byte[] _adr = BitConverter.GetBytes((short)startAddress);
msg[2] = _adr[1]; // адрес регистра
msg[3] = _adr[0];
byte[] _RegisterNum = BitConverter.GetBytes(RegisterNum);
msg[4] = _RegisterNum[1]; // количество регистров
msg[5] = _RegisterNum[0]; // для чтения
byte[] _length = BitConverter.GetBytes(length);
msg[6] = _length[1]; // длинна сообщения (кажется всего)
msg[7] = _length[0]; // длинна сообщения
byte[] _CRC = BitConverter.GetBytes(CRC);
msg[8] = _CRC[1]; // CRC16
msg[9] = _CRC[0]; // CRC16 контрольная сумма
Могу ошибаться написал по памяти))) Дa и еще важный момент старший и младший байт... мой пример работает на плк 100 если не читается нужно поставить native mode или tracert mode. для сериал порта
И еще. Библиотеки библиотеками но если это не понять то библиотеки эти бесполезны
Примеров по работе с сериал портом и сокетами валом.
Если нужно подробнее пишите в личку (на почту сообщение хоть придет. а то я форум не часто читаю)
За код во вложении сильно не бейте написано за 10 минут но 100% рабочий.
Это проще чем кажется..