В моем примере из поста 693, последняя ф.область "Счетчик =0" нестандартная, http://www.owen.ru/forum/showthread....l=1#post163913
Она нужна только для обнуления индикатора оставшегося времени если кнопка с реверсом бита, и в принципе эта ф.область не нужна
06.03.2015, 23:29
Владимир Дубоделов
Уважаемый, Petera!
В примере (окно 693) на панели имеются комментарии- как это делается ?
Заранее спасибо
В. Д.
08.03.2015, 19:19
Владимир Дубоделов
Petera, спасибо за подробный ответ. Теперь все понятно.
09.03.2015, 10:12
Mal
немного стыдно признаваться, но вот ответ на мои мучения с MOXA Uport 1150 - цитата из FAQ-ов панели СП270:
Цитата:
Вопрос:
При загрузке проекта в панель на экране появляется соответствующая пиктограмма, но строка загрузки не бежит. Через некоторое время конфигуратор выдает ошибку Time-Out. Подключение произвожу через преобразователь Usb-Com специально купленным кабелем КС4 «без переходника». Что я не так делаю?
Ответ:
Если версия конфигуратора соответствует (см.выше), причина в системе защиты MS Windows.
Для работы через преобразователь Usb-Com, необходимо отключить Брандмауэр Windows или другой установленный на данном компьютере файрвол.
Насколько я понимаю, соответствие RS-485 будет обеспечено терминалом при передаче (если порт правильно настроен), а соответствие стандарту Modbus и правильность ответа проверяет уже скрипт.
Вот новая функция, проверить по-прежнему нет возможности
Код:
Код:
const BYTES_PER_REG = 2;
const N_RETRIES = 3;
const RETRY_TIMEOUT = 1000; //ms
BOOL MWrites(int comID, int staID, int objType, int add1, int regs, void* pRegs) {
BYTE bSend[256], bRecieve[256], i;
WORD bBytesToSend = 0, bBytesRecieved = 65535;
BYTE nRetry = N_RETRIES; //Количество попыток повтора
BYTE offset_PSW_log;
int CrcSum;
switch (comID) {
case DOWNLOAD:
offset_PSW_log = 60;
break;
case PLC:
offset_PSW_log = 70;
break;
default:
return Writes(comID, staID, objType, add1, regs, pRegs); //don't know what to do
}
Enter(comID);//Захватить порт PLC
do {
if (bBytesRecieved != 65535) { //Была ошибка связи
PSW[offset_PSW_log+1]++;
if (bBytesRecieved != 0) // Ошибка данных
PSW[offset_PSW_log+3]++;
//else //Таймаут
// PSW[offset_PSW_log+2]++;
}
Send(comID, bSend, bBytesToSend);//Отправить команду
bBytesRecieved = Receive(comID, bRecieve, 256, RETRY_TIMEOUT, 6);//Получить ответ (тайм-аут 1000мс)
} while ((bBytesRecieved == 0 || //Если данные получены
bRecieve[0] != staID || //От правильного устройства
bRecieve[1] != bSend[1] || //Правильной функцией
MAKEWORD(bRecieve[3], bRecieve[2]) != add1 || // По правильному адресу
MAKEWORD(bRecieve[5], bRecieve[4]) != regs || // Правильное количество регистров
Crc(bRecieve, bBytesRecieved) != 0 //Контрольная сумма в порядке
) && (nRetry--)>0); //... то всё ок, иначе отнимаем попытку и, если они остались, пытаемся ещё
Leave(comID);//Освободить порт
if (nRetry>0) { //Если попытки остались, значит, последняя попытка связи была успешной
PSW[offset_PSW_log]++;
return TRUE;
} else
return FALSE;
}
Добрался потестить. Отправляет запрос с неправильным порядком байт
Исправил, вот эта штука работоспособна (полный цикл тестирования не проводился):
Код:
const BYTES_PER_REG = 2;
const N_RETRIES = 3;
const RETRY_TIMEOUT = 1000; //ms
BOOL MWrites(int comID, int staID, int objType, int add1, int regs, void* pRegs) {
BYTE bSend[256], bRecieve[256], i;
WORD bBytesToSend = 0, bBytesRecieved = 65535;
BYTE nRetry = N_RETRIES; //Количество попыток повтора
BYTE offset_PSW_log;
int CrcSum;
switch (comID) {
case DOWNLOAD:
offset_PSW_log = 60;
break;
case PLC:
offset_PSW_log = 70;
break;
default:
return Writes(comID, staID, objType, add1, regs, pRegs); //don't know what to do
}
Enter(comID);//Захватить порт PLC
do {
if (bBytesRecieved != 65535) { //Была ошибка связи
PSW[offset_PSW_log+1]++;
if (bBytesRecieved != 0) // Ошибка данных
PSW[offset_PSW_log+2]++;
//else //Таймаут
// PSW[offset_PSW_log+3]++;
}
Send(comID, bSend, bBytesToSend);//Отправить команду
bBytesRecieved = Receive(comID, bRecieve, 256, RETRY_TIMEOUT, 6);//Получить ответ (тайм-аут 1000мс)
} while ((bBytesRecieved == 0 || //Если данные получены
bRecieve[0] != staID || //От правильного устройства
bRecieve[1] != bSend[1] || //Правильной функцией
MAKEWORD(bRecieve[3], bRecieve[2]) != add1 || // По правильному адресу
MAKEWORD(bRecieve[5], bRecieve[4]) != regs || // Правильное количество регистров
Crc(bRecieve, bBytesRecieved) != 0 //Контрольная сумма в порядке
) && (--nRetry)>0); //... то всё ок, иначе отнимаем попытку и, если они остались, пытаемся ещё
Leave(comID);//Освободить порт
if (nRetry>0) { //Если попытки остались, значит, последняя попытка связи была успешной
PSW[offset_PSW_log]++;
return TRUE;
} else
return FALSE;
}
12.03.2015, 14:16
susanin
Коллеги. Возник такой вопрос:
Необходимо проверить введенное значение в числовое поле по нажатии кнопки "ENT" на цифровой клавиатуре определенному условию.
К примеру: Есть несколько цифровых полей ввода, их сумма не должна превышать определенного значения. При превышении должно выдаваться предупреждение.
12.03.2015, 14:40
petera
Цитата:
Сообщение от susanin
Коллеги. Возник такой вопрос:
Необходимо проверить введенное значение в числовое поле по нажатии кнопки "ENT" на цифровой клавиатуре определенному условию.
К примеру: Есть несколько цифровых полей ввода, их сумма не должна превышать определенного значения. При превышении должно выдаваться предупреждение.
Легко, но чур не на Си, я в нем не силен.
Сколько переменных в сумме и где предел хранится будет или он константа? Предупреждение какое хотите, окно или лампа или звук?
Только если редактируемое поле вначале обнулить, тогда можно вводить новые значения. Если так устраивает, то могу проект предъявить, если нет, тогда буду думать дальше
12.03.2015, 17:09
susanin
Интересное решение. ))
В принципе приемлемо. Только хотел несколько иного - попробую тоже что нибудь придумать.
Так как программирование под ОВЕН не основное занятие то все делается медленно ((