Просмотр полной версии : Плк63, 485-й мастер. Открытие порта и опрос.
Доброго времени суток господа. Угораздило меня не отговорить заказчика и взяться за проект с существующим ПЛК63. До этого имел дело только с ПР-ками и с ПЛК1**, а там это дело все куда проще реализовано. Дело срочное, а голова уже взрывается. Суть работы 485-го мастера через библиотеки я уже уловил, но не могу ухватить детали. Примеры по форуму 63/73 лопатил, нашел уже и открытие порта, и проекты с командными словами и кучу всего еще. Не могу теперь толком в голове увязать. Работаю на CFC. Собственно прошу помощи в следующих вопросах.
1) Открытие порта. Нашел несколько вариантов примеров. Смущает то, что ни один из них не выполнен на стандартных блоках из библиотеки SysLibCom. Правильно ли я понимаю, что при открытии порта через SysComOpen на входе должен быть номер порта, на выходе дескриптор, который потом можно брать на вход SysComSetSettings и на вход блока запроса через протокол Модбас из библиотеки Modbus.lib?
2) Обязательно ли задавать параметры порта и запроса модбаса через переменные или, при условии их неизменности, можно просто задавать их напрямую? По голове не бить, программист из меня пока (п)аховый.
3) Есть какой-то простейший пример, но со всеми шагами? Открытие порта+запрос чего угодно из слэйв устройства по модбасу, только на CFC? Сложновато с непривычки вникать в логику других языков. Проблема в том, что суть и логику работы я понимаю, но технические детали упускаю, а время жмет.
Заранее всем спасибо.
Филоненко Владислав
11.04.2022, 09:15
1) Поведение SysLibCom на ПЛК1хх и ПЛКхх ничем, кроме номеров портов и возможностей железа не отличается. Что и не удивительно, т.к. код по сути один и тот-же.
2) не обязательно, можно и напрямую
3) Пример на CFC? Не, у нас традиционные наклонности :) ST форева!
Филоненко Владислав
12.04.2022, 18:24
.. и возвращаемых SysComOpen значениях
.. и необходимости пересброса питания для 63/73 (или стартового закрытия порта) //актуально при отладке
Если писать код правильно - т.е. с деинициализацией выделенных ресурсов по событию STOP - проблем с переоткрытием порта нет.
В этом ПЛК работает механизм событий?
Мозг почти расплавился. Не могу никаким образом получить адекватно данные через этот гребанный 63-й. Не хвататет теории. Порт открыл, запрос сделал. Рядом собраны физически ПЛК63+МУ110-8AC+Датчик 2-10 вольт. Разгребался в примерах, общую суть понял, набросал простейшую прогу - и ничерта не могу вытащить данные. Причем в примере на FBD тоже работает все как-то странно. Читает с 1-го входа модуля 2 вольта, но не реагирует на них потом. Ткните рожей, где и чего упустил?
UPD: Неправильный пример всунул, заменил. Протестировал все на ПЛК100, с тем же модулем и датчиком, теми же настройками, адресами и скоростью - все работает через UMD в конфигурации. Все отлично видит и читает именно нужные мне 2*10 вольт и реагирует на изменение работы датчика. То есть я где-то косячу с выниманием данных из массива и не могу понять где. Не хватате теоретической подготовки все же... Если все же не лень, дайте подсказку куда копать.
Пример опроса МВ110-8AC:
VAR
MB_Get : MB_RD_HOLD_REGS;
ComService : COM_SERVICE;
Settings : COMSETTINGS;
ComPortState : BYTE := 0;
ES : BOOL := TRUE;
MBTimeOut : TIME := T#100ms; //например
Buffer : ARRAY[0..255] OF BYTE;
END_VAR
//настраиваем и открываем порт, например так:
IF ComPortState = 0 THEN
Settings.Port := 0;
Settings.dwBaudRate := 19200;
Settings.byParity := 0;
Settings.dwTimeout := 5;
Settings.byStopBits := 1;
Settings.dwBufferSize := 0;
Settings.dwScan := 0;
END_IF
ComService(ENABLE := ComPortState = 0, SETTINGS := Settings, TASK := OPEN_TASK);
IF ComService.Ready THEN
ComPortState := 2;
END_IF
//по готовности порта "работаем" с ним
IF ComPortState = 2 THEN
MB_Get(
Enable := ES,
Mode := MB_RTU,
DevAddr := 1, //например
FirstAddr := 280, //для МВ110-8AC
Quantity := 32, //"выгоднее" читать из МВ110-8AC всю пачку значений регистров сразу, вместе со статусами каналов
ComHandle := Settings.Port,
TimeOut := MBTimeOut,
Buffer := Buffer);
ES := FALSE;
IF MB_Get.Complete THEN
IF MB_Get.Exception = 0 THEN
...//разбираем Buffer
END_IF
ES := TRUE;
END_IF
Для работы нужны Modbus.lib, ComService.lib, SysLibCom.lib. Буфер, надеюсь, сами сможете разобрать.
Я, за сегодня, чему только не научился. Третью ночь не сплю. И с массивами разобрался и с тем, как их выдергивать... На данный момент есть только одна проблема - хз как работает опрос. И я не могу сообразить что с этим делать. То есть у меня банально из ФБ опроса по модбасу только изредка выходит "тру" на статусе. В те моменты когда это проскакивает, я в переменной вижу свои заветные циферки, которые мне и нужны. Я вроде добрый кусок форума перерыл, в том числе нашел топик, где достопочтимый Валенок рассказывает про пьяных реализаторов Овена. Но это не связанно с моей проблемой. Я пятой точкой чую что загвоздка где-то в другом, возможно в проверке успешности опроса блока модбаса, но пробовал реализовать его как смог в CFC, ситуацию это не поменяло. Грешил бы на связь - так с ПЛК100 все без проблем с той же конфигурацией. Игрался с таймингом на входе блока опроса - при ноле и рядом - вообще выдает хз что, при 30 и выше ситуация которую описываю. При 150 и выше ничего не меняется, кроме чатсоты появления "успешного" опроса. Вот я в конечном итоге и не пойму, почему блок опроса работает не стабильно.
ЗЫ: А откуда адрес 280? Это же статус вроде?
А откуда адрес 280? Это же статус вроде?
Да, пардон, если Вам статусы не нужны, то значения чуть ниже идут, с 288...
где достопочтимый Валенок рассказывает про пьяных реализаторов Овена
Нормально работает Modbus RTU и на 63-м, и на 73-м, и даже с теми же Modbus.lib, ComService.lib. Свой опросник на SysLibCom.lib (или UNM) все руки никак не доходят написать, но меня и работа библиотек Modbus.lib и ComService.lib вполне устраивает. Единственное неудобство у ПЛК63/73 может возникнуть (но это смотря для кого) - опрос нужно "поднимать" руками (на библиотеках, через конфигурацию не получится), но разовое и грамотное его написание этот недостаток снимает.
На CFC не подскажу (Вам самому нужно вникать), но я делаю всю реализацию алгоритма на ST. В свое время, перед первым появлением ПЛК ОВЕН у меня в руках, перечитал кучу информации на данном форуме и понял, что лучше сразу двигаться в сторону ST и библиотечной работы с протоколами обмена, сейчас тупо копипаст из проекта в проект с небольшими дополнениями/изменениями.
То есть у меня банально из ФБ опроса по модбасу только изредка выходит "тру" на статусе
Вы, кстати, проверяли мой код у себя?
Можно его "оформить" в FB и пользовать в CFC, "подсовывая" номера слэйвов, адреса регистров и их количество...
Сейчас планирую заняться, спасибо. Суть проблемы не в языке, суть в моей голове. Я не понимаю что я упускаю. То ли порт закрывать после опроса, то ли фиксировать как-то данные из буфера в момент подтверждения отработки опроса... Почитал ещё форум, много похожего, но никакой конкретики. Пока склоняюсь к рабочему варианту осваивать ST и брать его для ФБ, а тело писать на CFC. Суть ST мне понятна, только матчасть надо подтянуть.
При успешном открытии порта и пока идет обмен, его трогать не нужно. Информацию из буфера, желательно, забирать тогда, когда выполняются оба условия (Complete = TRUE и Exception = 0).
При успешном открытии порта и пока идет обмен, его трогать не нужно. Информацию из буфера, желательно, забирать тогда, когда выполняются оба условия (Complete = TRUE и Exception = 0).
Потестировал примеры из архива на ST и Ваш код, все работает. Вероятно так и буду обходить проблему. Но все равно надо понять в чем косяк. Пробовал реализовать вытаскивание через буфер только при условии что ошибок нет и Cmpl тру, но один черт, нужные параметры появляются, но не висят постоянно. В вашем коде и в примере, в буфере в результате опроса все висит постоянно. В моем случае - в буфере адовые поскакушки, потому что успешный опрос входов модуля происходит раз в несколько секунд и на очень короткое время. И вот тут я и не могу понять где загвоздка. В теории все настройки одинаковые и т.д. Я бы грешил на что-то вроде того, что программа маленькая и банально слишком быстро катается по циклу, но ведь и в примере она такая же. И вот тут-то я и спотыкаюсь об отсутсвие теоретической подготовки =( То есть все настройки одни и те же, я опрашиваю один и тот же модуль с теми же таймаутами и т.д. Но в моей программе на CFC не хватает чего-то, что заставляет работать блок опроса непрерывно, а не как у меня - раз в n секунд и то хз равномерно или нет.
Филоненко Владислав
14.04.2022, 14:16
У Владислава секретная модификация
А еще у него события STOP возникает на заводской сброc видимо.
А чего разные цифирки от syscomopen ?
Это по поводу "одного и того же кода" для 63 и 1**
Лучше б запилили сводную таблицу локальных особенностей плк-шек.
Имитировать событие стоп - можно и без поддержки событий :) 3 строчки кода
Филоненко Владислав
15.04.2022, 10:50
1. "Имитировать". Резет. Он есть и на 63/73
2. Стартовое закрытие порта - 1(одна) строка кода
По теме - вопрошающий вроде все получил.
Ну вот, тов. Валенок, сами всё и решили. А то секретная модификация... (хотя я могу) :)
Для начала :
- А на кой Вы вытягиваете cmpl если нигде вообще дальше его не юзаете ?
Вы б его (AND Exeption = 0) завели б в EN для OR#20
(Вам это уже сказал Spawn #14)
Заставьте себя закрыть и не смотреть. Вас не должно волновать как и что повар шинкует на столе буфера.
Вас должно интересовать только что принесут когда повар скажет "кажись готово (cmpl) и вроде получилось (Exeption = 0). Несите на столик x для Аши"
Вот именно этот момент (EN/ENO) я и искал. Именно его + увеличения таймаута не хватало, чтоб я получил ту самую картину, которую хотел. Огромное спасибо. Проверку состояния я делал уже после того, как выложил сюда пример, но реализовал не так, и потому не получал искомого.
Господа специалисты! Есть еще один архиважный вопрос. Наколдовал я себе и опросы и все остальное. Разобрался, посмотрел на СТ и т.д. Теперь началось самое интересное. Суть вопроса: Есть система, 63-й в роли мастера, опрашивает три частотника, считывая с них рабочую частоту или задание. С этим проблем нет. Но дальше мне нужно записать в два FC-051 командное слово и задание и тут начинается ад. В первый частотник командное слово пишется. Пишу его в регистр 50000, по адресу 49999. Пишу через MB_WR_REGS. При это задание не хочет писаться ни в какую. Пытался писать его и в 50009 и в 3099 - нет и все. А для полного ада - если выставить таймауты вменяемые - то опрос начинает крутится так шустро, что буфер превращается в кашу. И второй частотник не запускается и первый падает в ноль. Если на втором поставить дикий тайминг, что-то вроде 300мс, то первый запускается. а цикл опроса зависает на втором. Подскажите куда копать. Я с форума упер конструкцию с триггерами, которая должна держать в работе блок, покуда он не запишет все, но эта история не работает. В мыслях сделать отдельно опрос первых трех частотников, закрытие порта и отдельную запись в два рабочих. Либо каким-то образом привызявать запись к изменению задания, но я и задание пока не смог забросить в частотник. Код завтра сюда добавлю, сегодня нет возможности. Но может кто сталкивался с такой историей и потычет пальцем в какую сторону копать?
kondor3000
20.04.2022, 16:23
. Пишу его в регистр 50000, по адресу 49999. Пишу через MB_WR_REGS. При это задание не хочет писаться ни в какую. Пытался писать его и в 50009 и в 3099 - нет и все. А для полного ада - если выставить таймауты вменяемые - то опрос начинает крутится так шустро, что буфер превращается в кашу.
С какого вы пишите в регистр 50000, по адресу 49999 ?
Разберитесь с регистрами сначала. Скрины адресов выложите.
Частотники создают сильные помехи, поэтому обязательно частотники относите подальше, резисторы 120 Ом на вход выход 485 порта, провода в экраны, экраны заземлить перед входом в ПЛК.
Сделайте новый проект и полностью чтение, запись с одним частотником наладьте.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot