В моем примере из поста 693, последняя ф.область "Счетчик =0" нестандартная, http://www.owen.ru/forum/showthread....l=1#post163913
Она нужна только для обнуления индикатора оставшегося времени если кнопка с реверсом бита, и в принципе эта ф.область не нужна
немного стыдно признаваться, но вот ответ на мои мучения с 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
}
bSend[0] = staID;
switch (objType) {
case MODBUS_RTU_REGS_4X:
bSend[1] = 0x10;
break;
default:
return Writes(comID, staID, objType, add1, regs, pRegs); //don't know what to do
}
bSend[2] = HIBYTE(add1);
bSend[3] = LOBYTE(add1);
bSend[4] = HIBYTE(regs);
bSend[5] = LOBYTE(regs);
bSend[6] = regs * BYTES_PER_REG;
bBytesToSend = 7;
for (i=0; i<regs*2; i++) {
bSend[bBytesToSend] = ((BYTE*)pRegs)[i];
bBytesToSend++;
}
CrcSum = Crc(bSend, bBytesToSend);
bSend[bBytesToSend] = LOBYTE(CrcSum);
bSend[bBytesToSend + 1] = HIBYTE(CrcSum);
bBytesToSend += 2;
if (bBytesToSend > 256)
return FALSE;
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
}
bSend[0] = staID;
switch (objType) {
case MODBUS_RTU_REGS_4X:
bSend[1] = 0x10;
break;
default:
return Writes(comID, staID, objType, add1, regs, pRegs); //don't know what to do
}
bSend[2] = HIBYTE(add1);
bSend[3] = LOBYTE(add1);
bSend[4] = HIBYTE(regs);
bSend[5] = LOBYTE(regs);
bSend[6] = regs * BYTES_PER_REG;
bBytesToSend = 7;
for (i=0; i<regs; i++) {
bSend[bBytesToSend] = HIBYTE(((WORD*)pRegs)[i]);
bBytesToSend++;
bSend[bBytesToSend] = LOBYTE(((WORD*)pRegs)[i]);
bBytesToSend++;
}
CrcSum = Crc(bSend, bBytesToSend);
bSend[bBytesToSend] = HIBYTE(CrcSum);
bSend[bBytesToSend + 1] = LOBYTE(CrcSum);
bBytesToSend += 2;
if (bBytesToSend > 256)
return FALSE;
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;
}
Последний раз редактировалось SokolovS; 13.04.2015 в 12:11.
Причина: порядок байт контрольной суммы тоже поправил и ещё одну ошибочку тоже
Необходимо проверить введенное значение в числовое поле по нажатии кнопки "ENT" на цифровой клавиатуре определенному условию.
К примеру: Есть несколько цифровых полей ввода, их сумма не должна превышать определенного значения. При превышении должно выдаваться предупреждение.
Необходимо проверить введенное значение в числовое поле по нажатии кнопки "ENT" на цифровой клавиатуре определенному условию.
К примеру: Есть несколько цифровых полей ввода, их сумма не должна превышать определенного значения. При превышении должно выдаваться предупреждение.
Легко, но чур не на Си, я в нем не силен.
Сколько переменных в сумме и где предел хранится будет или он константа? Предупреждение какое хотите, окно или лампа или звук?
Предел константа, храниться в энергонезависимой памяти, к примеру PFW[256]. Количество переменных в сумме 7 (7 полей ввода).
В общем пока столкнулся с проблемой.
Если вводить значения с нуля, то работает вот так
:
Но когда пытаюсь редактировать значения, то нельзя ввести значения меньше расчетного, даже меньше того, что было в поле ввода
:
Только если редактируемое поле вначале обнулить, тогда можно вводить новые значения. Если так устраивает, то могу проект предъявить, если нет, тогда буду думать дальше