Вариашечка
Сделал отдельным экраном, так гораздо приятнее и универсальнее
Если кто-нибудь подскажет как конкатенацию строк сделать, попробую сделать поле, отображающее текущие настройки сети
Последний раз редактировалось SokolovS; 06.10.2014 в 13:41.
И теперь вопрос
Вроде видел работу панелью со временем, но не знаю как искать
Мне требуется задавать текущее время и день недели в панели, а также время и день недели нескольких событий. Ну и делать всякие дела по наступлении событий этих.
Возможно такое? Какова реакция на потерю питания будет?
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Здесь помогут регистры
PSW74,75 для порта PLC
Захват-2.png
и PSW64,65 для порта Download
Захват-1.png
Если ограничится из всех протоколов, имеющихся в панели http://www.owen.ru/forum/showthread....l=1#post101140,только протоколом ModBus, то
Настройки порта PSW64(74) PSW65(75) Порт не используется 0 0 Modbus RTU (Панель мастер) 5 13 Modbus ASCII (Панель мастер) 22 15 Modbus RTU Slave (ПЛК мастер) 23 5
В скобках регистры для порта PLC
Таким образом показывать поле адреса панели нужно (использовать IF) если, например, PSW64 или PSW74 равно 23 для выбранного порта.
Последний раз редактировалось petera; 06.10.2014 в 11:20.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Подскажите как можно с помощью панели задавать время работы блока "Blink" в ПЛК 160 ?
Смотрите пример на диске, который идет с ПЛК
Захват-1.png
или можно скачать отсюда http://www.owen.ru/forum/showthread.php?t=13581
Пример http://kipshop.ru/Primeri/HMI/03_06_...ter]_timer.zip
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Проблема раз:
СП270 сильно умная, МУ110 не понимает глубины полёта мысли.
Использую для управления модулем скриптовую функцию Writes и регистр 50й (в него записывается состояние сразу всех выходов, это удобно), ожидая от неё запроса 0x10. Однако панелька оптимизирует запросы и, поскольку изменить требуется только один регистр, посылает запрос 0х06. К сожалению, МУ110 обрабатывать такие не умеет. Есть ли какой-либо способ уговорить панель использовать запрос 0х10? Ну, кроме работы с портом напрямую.
Проблема два:
Трудно выделить ключевые моменты, поэтому описываю целиком ситуацию.
Та же СП270 и МУ110. За обмен информацией отвечает скрипт. Его задача - при наличии разрешения (PSB) отправить регистры (PSW) по заданному адресу. Разрешение сделано с прицелом на расширение, поэтому бит разрешения сразу в скрипте устанавливается сразу и не снимается.
Теперь ситуация. Сразу после запуска панели она устанавливает нужное состояние выходов модуля. Как только действия оператора приводят к тому, что состояние выходов должно измениться, панель выполняет это (выходы переходят в нужное состояние) и тут же виснет (появляется микросхемка), перезагружается и всё по новой.
Причём:
1) Комментирование строчки скрипта, отвечающей за установку бита (SetPSB(...); ), делает прошивку стабильной.
2) Перенос строчки в другое место и усиленная проверка на ошибки ничего не меняет.
3) При закомментированной строчке скрипта тот же самый бит, установленный любым другим способом (вручную кнопкой управления битом или функциональной областью), не приводит к зависанию панели.
К сожалению, в "поле" у меня не было особой возможности и желания проводить эксперименты. Панельку работать заставил, однако неплохо бы знать причину такого поведения. Сталкивался ли кто-нибудь с подобным?
Последний раз редактировалось SokolovS; 22.10.2014 в 11:22.
Спасибо, но хотелось бы решить это на скриптах
Вариант №1
Захват-2.png
Создаем команду 0х10 прямо в функции
Вариант №2Код://В примере адрес устройства равен 1 //Данные с маской выхoдов МУ в регистре PSW300 //************************************************* BYTE snd[11]={0x01,0x10,0x00,0x32,0x00,0x01,0x02};//буфер для посылки команды slave //[0]-адрес устройства(0x01) //[1]-Код функции ModbusRTU 0x10 -запись нескольких регистров //[2]-ст.байт адреса начального регистра(0x00) //[3]-мл.байт адреса начального регистра(0x32) //[4]-ст.байт количества регистров(0x00) //[5]-мл.байт количества регистров(0x01) //[6]-количество байтов(0x02) //[7]-ст.байт значения в регистре(Определим ниже) //[8]-мл.байт значения в регистре(Определим ниже) //[9]-ст.байт CRC(Определим ниже) //[10]-мл.байт CRC(Определим ниже) BYTE rcv[8];//буфер для приема ответа от slave //[0]-адрес устройства //[1]-Код функции ModbusRTU-запись нескольких регистров 0x10 //[2]-ст.байт адреса начального регистра(0x00) //[3]-мл.байт адреса начального регистра(0x32) //[4]-ст.байт количества регистров(0x00) //[5]-мл.байт количества регистров(0x01) //[6]-ст.байт CRC //[7]-мл.байт CRC snd[7]=HIBYTE(PSW[300]); snd[8]=LOBYTE(PSW[300]); snd[9]=HIBYTE(Crc(snd,9));//дополнить команду CRC, сначала Hi snd[10]=LOBYTE(Crc(snd,9));//затем Lo //Crc() -внутренняя функция, ее писать не надо Enter(PLC);//Захватить порт PLC Send(PLC,snd,11);//Отправить команду Receive(PLC,rcv,8,1000,6);//Получить ответ (тайм-аут 1000мс) Leave(PLC);//Освободить порт
Захват-3.png
Создаем глобальную функцию для записи маски выходов в МУ110 с любым адресом
Теперь эту свою функцию можем использовать в любых местах любых скриптов наравне с стандартными функциями Write() или Writes()Код:BYTE MY_16WRITE(BYTE Adres, WORD Mask) { BYTE rcv[8];//буфер для приема ответа от slave //[0]-адрес устройства //[1]-Код функции ModbusRTU-запись нескольких регистров 0x10 //[2]-ст.байт адреса начального регистра(0x00) //[3]-мл.байт адреса начального регистра(0x32) //[4]-ст.байт количества регистров(0x00) //[5]-мл.байт количества регистров(0x01) //[6]-ст.байт CRC //[7]-мл.байт CRC BYTE snd[11]={0x01,0x10,0x00,0x32,0x00,0x01,0x02};//буфер для посылки команды slave //[0]-адрес устройства //[1]-Код функции ModbusRTU 0x10 -запись нескольких регистров //[2]-ст.байт адреса начального регистра //[3]-мл.байт адреса начального регистра //[4]-ст.байт количества регистров //[5]-мл.байт количества регистров //[6]-количество байтов //[7]-ст.байт значения в регистре //[8]-мл.байт значения в регистре //[9]-ст.байт CRC //[10]-мл.байт CRC snd[0]=Adres; snd[7]=HIBYTE(Mask);//Данные с маской выхoдов МУ110 сначала Hi snd[8]=LOBYTE(Mask);затем Lo snd[9]=HIBYTE(Crc(snd,9));//дополнить команду CRC, сначала Hi snd[10]=LOBYTE(Crc(snd,9));//затем Lo //Crc() -внутренняя функция, ее писать не надо Enter(PLC);//Захватить порт PLC Send(PLC,snd,11);//Отправить команду Receive(PLC,rcv,8,1000,6);//Получить ответ (тайм-аут 1000мс) Leave(PLC);//Освободить порт //Надо бы сделать проверку ошибок //обмена, хотя бы CRC ответа сравнить return TRUE;//Пока так }
Например
UPD. Обновил вложения и картинки (были ошибки)Код://Используется глобальная функцияMY_16WRITE(BYTE Adres, WORD Mask) //где //Adres -Адрес устройства //Mask -маска выходов MY_16WRITE(1,PSW[300]);//Запись в МУ110 с адресом 1, маска в PSW300 MY_16WRITE(16,PSW[301]);//Запись в МУ110 с адресом 16, маска в PSW301 MY_16WRITE(32,PSW[302]);//Запись в МУ110 с адресом 32, маска в PSW302
Последний раз редактировалось petera; 28.10.2014 в 15:42.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg