Вероятно, некорректно настроен обмен (сетевые настройки, адреса регистров и т.д.) или проблема с кабелем (не та распиновка или поврежден).
Вид для печати
Вероятно, некорректно настроен обмен (сетевые настройки, адреса регистров и т.д.) или проблема с кабелем (не та распиновка или поврежден).
С обменом между панелью и ПЛК все в порядке. При нажатии кнопки на панели, в ПЛК состояние бита изменяется сразу, а на панели состояние кнопки изменяется с задержкой. Задержка есть и при переходе на панели к другому окну.
Добавьте на экран индикаторы с битами PSB50 и PSB51. Это биты статусы связи для Download- и PLC-порта. Если один из них (соответствующий вашему порту) будут мигать красным - то, очевидно, все же есть какая-то проблема с обменом.
Подскажите как в макросе можно словить фронт бита?
Требуется подать звуковой сигнал при смене состояния бита. Битов много.
C зуммером понятно, сделать для каждого бита и радоваться. Но если по мимо звука надо открыть окно с сообщением или еще что сделать. То для каждого бита делать еще элемент "Функциональная область" или создавать окно тревоги. Битов очень много.
Много элементов получается, хотел как проще и меньше муторной работы. С кодом проще и быстрей работать, чем графику и настройки туда сюда гонять.
Насколько я знаю зуммер работает только если открыт тот экран на котором он расположен. У меня биты раскиданы по разным экранам.
Вот пример.Вложение 37597
Для каждого бита потребуется доп. бит, чтобы помнить о предыдущем состоянии.
Зуммер может быть глобальным - тогда будет работать независимо от открытого экрана.
Сложность еще в том что биты у меня храняться в PSW. Написал следующую функцию:
Работает если только один бит сработал, если при включенном бите сработает еще один, то тогда начинает пищать постоянно.Код:void AlarmEdge(WORD NumWord, WORD NumBit){
if( (PSW[NumWord]&(1<<NumBit)) && !(PSW[NumWord+50]&(1<<NumBit)) )
{
Beep();
PSW[NumWord+50] = 1 | (1<<NumBit);
}
else if ((PSW[NumWord]&(1<<NumBit))!=0)
{
PSW[NumWord+50] = 0 | (1<<NumBit);
}
}
Если в одном регистре, можно так сделать... как вариант, для одного регистра
Панель должна пикнуть при установке любого бита PSW[111] в 1
Код с коленки, не тестировалсяКод:void AlarmEdge() {
static WORD last_val;
WORD cur_val;
cur_val = PSW[111];
if ( (cur_val & ~last_val ) > 0 ) {
Beep();
}
last_val = cur_val;
}
В этом случае будет пиликать всегда, при появлении бита и пропадания, пока все биты не потухнут. Нужно чтобы сигнал шел только при переднем фронте.