Приложи проект полностью в архиве... посмотрю сегодня , завтра... и проект для плк
Приложи проект полностью в архиве... посмотрю сегодня , завтра... и проект для плк
Пхххх.... Ну проект тогда сюда целиком что ли. И настройки используемого последовательного порта ПЛК из кодесиса тоже.
в общем я на шарпе чуток работал. я собственно работал с 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% рабочий.
Это проще чем кажется..
Последний раз редактировалось Kostennikov; 20.01.2016 в 16:16.
Ссыль на проект - https://onedrive.live.com/redir?resi...hint=file%2c7z. К проекту на плк у меня доступа нет, знаю только, что там добавлен RS-485(FIX). Настройка порта задается с ЖКИ
Как говорил ув. Yegor. А откуда берется port? А порт у вас не инициализирован собственно. у вас только установлена скорость обмена. несомненно порт откроется. а остальное по умолчанию следовательно запустится с системными настройками ОС.
у вас:
какой порт ты открыли? с какой скоростью с ним работать? сколько бит данных? стоповые биты?Код:port.Open(); if (!port.IsOpen) MessageBox.Show("Порт не открыт");
должно быть примерно так:
а вы не задали настройки порта поэтому и не читается все собственно.Код:_serialPort = new SerialPort(); _serialPort.PortName = SetPortName("COM6"); _serialPort.BaudRate = SetPortBaudRate(9600); _serialPort.Parity = SetPortParity(Parity.None); _serialPort.DataBits = SetPortDataBits(8); _serialPort.StopBits = SetPortStopBits(StopBits.One); _serialPort.ReadTimeout = 500; _serialPort.WriteTimeout = 500; _serialPort.Open(); if (! _serialPort.IsOpen) MessageBox.Show("Порт не открыт"); private void button1_Click(object sender, EventArgs e) { var mbus = ModbusSerialMaster.CreateRtu(port); MessageBox.Show((mbus.ReadHoldingRegisters(0, 3, 1)[1]).ToString()); } //или в одну строчку если жестко надо задать SerialPort _serialPort = new SerialPort( ″COM1″ , 9600, Parity.None, 8, StopBits.One); _serialPort.Open(); if (! _serialPort.IsOpen) MessageBox.Show("Порт не открыт"); private void button1_Click(object sender, EventArgs e) { var mbus = ModbusSerialMaster.CreateRtu(port); MessageBox.Show((mbus.ReadHoldingRegisters(0, 3, 1)[1]).ToString()); }
не факт что у вас системные настройки стоят такие же как у плк к которому подключаетесь.
ну и не забывайте ошибки порта обрабатывать иначе замучаетесь и не будете знать в чем ошибка)).
Задайте настройки порта у плк и точно такие же пропишите в программе один в один. не забудте указать ком порт в программе через который идет общение с плк.
В общем инициализируйте порт попробуйте.
За работу библиотеки ни чего не скажу... как там читается - пишется.
Я пробую без библиотек ибо это интересней.
п.с. За ошибки ответственности не несу)). Я пытаюсь вас направить.
вот ссылочка https://msdn.microsoft.com/ru-ru/lib...v=vs.110).aspx там все про ком порт. Ну и гугл помогает.
Я кстати выше писал про порядок байт возможно в плк надо поменять режим с native mode на tracert mode. но если не имеете доступа к плк, то библиотеке надо указать порядок байт если она это умеет. если нет то пишите функции которые необходимы сами. пример я приводил. прикладываю проект буржуйского коллеги если не заработает то скорее всего у вас именно что то с порядком байт. ну или что то со связью
также попробуйте утилиту peakhmi. попробуйте с помощь нее подключиться к плк. вам нужно установить serial master. там можно выставить порядок байт если заработает то надо смотреть библиотеку как она работает
может в плк не настроен слейв, а мастер?
(если настроен мастер то вам не писать в порт надо, а читать то что из него приходит и отвечать что прочитали?(если библиотека не умеет отвечать. может функция не та используется?))
может адрес слейв не 1?
Вообще что нибудь работает с плк по этому интерфейсу? панель или другой девайс, программа.
да кстати если делали настройки в плк скорость и все такое возможно его надо перезагрузить малоли как там реализовано. может поэтому у вас не получалось.
Последний раз редактировалось Kostennikov; 21.01.2016 в 13:17.
https://onedrive.live.com/redir?resi...nt=photo%2cpng - порт настроен в конструкторе. Есть готовая прога, которая успешно опрашивает ПЛК по этому интерфейсу. Адрес слейва я програмно перебирал даже, как и numberOfPoints... Начсет библиотеки, я пытаюсь использовать её, потому, что даже пытаться разобраться в принципах работы этого протокола не хочу совершенно, я ведь даже не знаю, что за прога в ПЛК. Мне просто нужно вытащить данные, засунуть их в бд и разработать веб-приложения для визуализации всего этого дерьма. В общем, проблема не в настройках порта, они выставлены один в один, как на ПЛК
Ну а что стоит обратиться к тому чья эта прога и узнать список регистров может вы пытаетесь читать то чего там нет))). Карта регистров есть(мне попадался как то плк там такой круговорот регистров был...)? И не работает ли эта прога одновременно с вашей?
Вы сами то не рассказываете что да как. все возможное я уже перебрал.
Давайте от конкретных значений отталкиваться.
Адрес плк. какой, номер регистра, его тип word, float. какой функцией читаете?
Последний раз редактировалось Kostennikov; 22.01.2016 в 13:11.
Те, чья прога с нами работать отказываются. Карты регистров нет. Я, честно говоря, даже не понимаю, что это такое. Адрес ПЛК 1. Функции все из библиотеки NModbus перебрал, в нелепой попытке прочитать с устройства хоть что-нибудь. А рассказываю я вам всё, что знаю сам, просто я почти ничего не знаю, в этом то вся и проблема. Спасибо вам кстати большое за то, что помогаете.
я правильно понимаю, что Вы о плк63 говорите? Если да, тогда вот ссыль http://www.owen.ru/uploads/rp_plk63.73.pdf где в таблице А есть номера регистров, вторая и третья колонки, простой перебор от нуля не один раз будет уходить в таймаут
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран