YuriBel, спасибо, я даже не думала, что всё настолько просто :)
Вид для печати
YuriBel, спасибо, я даже не думала, что всё настолько просто :)
capzap подобным костылем и я читаю выходы. Дело то несколько в другом.
Читаем то мы всего 1 байт так ? вроде так.
После завершения процедуры, раз уж нельзя в библе определять массив и он всегда 256 байт, результат должны получить всего 1 байт - вроде тоже так.
Почему он в ячейке [1] а не [0] ? было бы логичнее, раз у нас массив [0..255]
Или почему в массиве не весь конверт ответа от слейва (правда тогда массив должен быть больше, с учетом служебной инфы) ?
Это я вычислил, в какой ячейке мой результат, потому что железо стоит на столе и я ему вкл/выкл выходы и могу понять, что результат в [1] а не где-то еще по завершении комплит. Но результат самой FB не логичен.
Что произойдет, когда читать будем 256 байт ? [0] то вылетело куда-то...
Вот такие несуразности и удивляют в подобных вещах, а еще накладываются собственные ошибки и вообще туши свет :)
еще раз читайте ссылку про модбас, мы никогда не читаем байт, регистр это слово состящее из двух байт, поэтому инт16 значением до 255 будет распологаться в первом байте а не нулевом. Пока проблемы только в Вашей голове, библиотека работает нормально всё в соответствии со стандартом, на выходе блока массив заполняется с нуля запрошенными данными, а служебная информация в ответе предварительно вырезана
amn и capzap Семен Семеныч! :)
Вот я тормознул на слове :)
Спасибо, а то уж думал точно что-то с головой.....
Подскажите, как правильно считать слово из байтового массива ?
Если не ошибаюсь, то с заменой местами младшего и старшего байтов будет так:
var
ptr_D:POINTER TO BYTE;
B: ARRAY [0..255] OF BYTE;
word1: WORD;
END_VAR
ptr_D:=ADR(word1);
ptr_D^:=B[1];
ptr_D:=ptr_D+1;
ptr_D^:=B[0];
amn то есть простых вариаций типа BUFFER.word#0 или что-то в этом роде не предусмотренно ?
и зная, что они переставлены местами прокрутить на 8 бит.
Можно так:
word1:= B[1] OR SHL(BYTE_TO_WORD(B[0]),8);
или
word1:= B[1] + SHL(BYTE_TO_WORD(B[0]),8);
Возможно ли такое: мастером управляем через библиотеку по одному интерфейсу, а слейв организуем на другом интерфейсе через конфигурацию.
Работать будет?
Будет.
Набранное вами сообщение слишком короткое. Увеличьте ваше сообщение до 10 символов.
Здравствуйте. Хотел бы уточнить. При работе с библиотекой Modbus.lib открываем и настраиваем порт. Надо ли его иногда закрывать и в каких случаях? В случае перезагрузки ПЛК никаких проблем не возникнет, если порт не был закрыт?
С уважением, Михаил.
возможно ли программу из кодесиса перевести в степ7?
service в вариант SCL возможно из ST возможно с наименьшими телодвижениями. Но это только в v11 и выше. (Tiaportal) ну или если доставлен в 5.4 степа.
Если в CFC написано, то он у них несколько платный.
А так вообще возможно все.
я чтобы понять как в ST написать FB в КДС, набросал ее в FBD на степе и переключил на STL, мне стало понятнее.
Жаль, что в CodeSys нельзя переключать тело программы на другой язык на лету как в Степе. Очень удобно для понимания и обучения.
Такой вопрос. Можно ли сделать ПИД регулирование ступенчатым, используя 3 контактора подключения тэнов ?
Или получится ерунда ?
kgsh82, понял, спасибо. Учел ТТР, но блин с защитой по КЗ дорого, думаю легче будет поменять тэн вместе с ТТР в случае чего.
kgsh82 цепь вся - автоматический выключатель кривая B с размыкателем по перегреву тэна (2-я сткпень перегрева 130 гр, сухой контакт), контактор с реле отключения и командой на контролер по перегреву 1-й ступени 80гр, ТТР с варистором на выходе.
Скажем так защита в пределах, но при КЗ ТТР может сдохнуть, так как кривая B автомата несколько дольше работает, чем может выдержать ТТР.
Блин, сейчас таки нашел схему тэнов, трехфазная звезда без нуля, выходит я не могу использовать однофазные ТТР с управлением 4-20мА ? или все-таки можно, если ТТР расчитан на 380 В ?
если вы ориентируетесь на ТТР от Кипприбора, то у них реле с управлением 4-20 мА расчитаны на 250 В.
А в принципе ТЭН-вещь довольно инерционная и нагревом можно управлять дискретными сигналами от контроллера или модуля через ШИМ.
YuriBel нет, я ориентировался немного на другие реле, с напряжением 380В, но китай и у нас в сетях бывает 415-420В влегкую.
Скорее всего я ппоставлю 3Р ТТР кипприборовское и с помощью ШИМ буду управлять.
А однофазки уже через 4-20 мА.
Уважаемые коллеги, вылез какой-то косяк и не могу понять в чем дело. Связано это с чертовым конфигуратором. В нем реализован обмен по 485 интерфейсу в качестве мастера. Опрашивает ПЛК100 модули МВ110-8А, МВ110-16ДН и МУ110-8Р и частотник delta vfd-f на скорости 9600 без четности и одним стоп битом. После того как я немного рационализировал сохранение на флеш количество наработаных двигателями часов (стал все писать в один файл, вместо "для каждого свой") лег обмен по 485. Больше вроде как ничего не делал. Один раз наблюдал такую хрень на другой проге, но решил что какой-то единоразовый глюк. Помимо тех процесса контроллер общается по двум ком-портам с панелью и верхним уровнем посредством самописной биб-ки (тут проблем нет). Где-то видел упоминания от людей о том, что конфигуратор ложиться, а вот от чего хз. Может кто сталкивался? Ошибок модуль статистик не выдает.
Дополнено: не знаю что за глюк был, но после полного ресета со сбросом с удержаной кнопкой старт и последующей перезаливкой проекта, все заработало... Надолго ли.... ох надо писать мастер самому как и слейв :)
Подскажите, как битовой переменной выхода присвоить символьное имя ?
есть переменная out32 (по адресу модуля), это соответственно регистр (например 8 выходов)
условие - out32.1 (ну и так далее)
Как привильно присвоить этому out32.1 имя, чтобы не писать как выше, а написать например V1_lamp ?
А то как ни пишу в переменных все время на что-то ругается, то подавай ему тип, то не хватает : перед .
1. В настройках проекта: Опции-->Генератор кода --> установить галку "Замена констант".
2. В глобальных переменных создать такой раздел объявлений
И в программе можно обращаться такКод:VAR_GLOBAL CONSTANT
V1_lamp:INT:=0;
V2_lamp:INT:=1;
V3_lamp:INT:=2;
..................
V8_lamp:INT:=7;
END_VAR
out32.V1_lamp:=TRUE;
out32.V2_lamp:=FALSE;
out32.V3_lamp:=0;
out32.V4_lamp:=1;
и т.д.
Можно красивее. Как рассказал petera, только вместо глобальных констант создавайте перечисления такого вида:Теперь можно делать out32.Pump1 := TRUE; out32.Valve2 := FALSE.Код:TYPE DO1 : (Pump1, Valve2, Valve3);
END_TYPE
petera несколько не отменяет проблемы, потому что все равно придется писать out32.
хотелось именно заменить, то есть написал V1_lamp и программа знает, что это out32.0 а потом весь out32 отправлять в регистр модуля вывода.
Yegor перечисления где необходимо сделать ? в разделе переменных или в самой программе ?
В типах данных.
Сильно извиняюсь если вопрос уже задавали, Как мне распаковать маску входов МДВВ на 12 входов в CFC, на 8 нашел unpack. а на 12?
Дмитрий сдвинуть регистры слова на 8 бит и подать на второй unpack как вариант.
или считать в переменную Х: word; регистр, а потом использовать в программе без распаковки X.0, X.1, ... , X.12
Всем привет. Столкнулся с проблемой ограничения количества дискретных входов/выходов. Как добавить дополнительный модуль к ПЛК-160?
По сети RS 485 .ПЛК мастер сети ,модуль -слейв
Как правильно организовать ожидание сигнала логической единицы на IL? Я пока сделал следующим способом:
label:
LD UP -загружаем состояние переменной(входа) в аккумулятор
JMPCN label -пока 0 прыгаем снова на метку
далее продолжение обработки
переменная(контакт датчика) изменяет свое состояние с 0 на 1 менее чем на 1 сек
Как сделать красивее?
Если зацикливать опрос, то в эмуляции срабатывает таймер-сторож.Мой вариант тоже работоспособен(в спектрумах работал). Хочется функцию(элемент библиотеки), что-бы при вызове ее она просто ждала импульс со входа и при этом не срабатывал сторож. Ваш вариант тоже предполагает зацикливание.
Немного не понял принцип. Ваш код вызывается как ФБ например из тела блока SFC
CAL WAIT(CLK:=UP)
в теле ФБ WAIT пишем
LD CLK пишем в аккумулятор содержимое CLK
JMPC else1_0 при единице прыгаем на метку
RET иначе возвращаемся в тело блока SFC (а зачем? единицы то не было)
else1_0: а тут куда ходить?
end1_0: