в общем я на шарпе чуток работал. я собственно работал с 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% рабочий.
Это проще чем кажется..




Ответить с цитированием