Спасибо, удалось подключиться, теперь возникла проблема с отправкой команды:
при отправки команды на запуск (22) ПЧ никак не реагирует, может еще что-то надо передать?
Вид для печати
Напишите этот вопрос на support@owen.ru, пожалуйста - вас проконсультируют по настройке AFD-E для управления по интерфейсу.
Но навскидку - функцию надо выбрать WRITE_SINGLE_REGISTER.
https://owen.ru/forum/showthread.php...l=1#post402051
Тогда - технически это реализуемо на СПК, но потребует определенных усилий.
Описание отдельных аспектов текстом заняло бы много времени; я предлагаю обсудить это голосом.
Напишите мне в личку ваш контактный телефон (и укажите, привязан ли к нему telegram) и во сколько с вами в понедельник можно будет связаться.
Я писал по поводу Com-порта и до сих пор ответа нету, только Вы ответили.
с этой функцией не работает, при опросе в Owen OPC Server используется WRITE_MULTIPLE_REGISTERS и меня смущает параметр xDone, если я правильно понимаю при правильной записи должен принять TRUE. И в Owen OPC Server есть параметр включен в работу, может в коде надо еще что-то передать?
Можно и WRITE_MULTIPLE_REGISTERS использовать, но по документации - WRITE_SINGLE_REGISTER тоже подходит.
Судя по новым скриншотам - у вас блок нигде не вызывается.
Для вызова надо в строке 42 (указал ее для примера) сделать так:
Код:fbMbSerialRequest();
После этого наблюдайте за значениями выходов ФБ.
Я ведь правильно понимаю, что значение eState вы пока вручную для отладки меняете, а не пытаетесь им манипулировать где-то в коде, который не попал на скриншоты?
Выкладываю код, в этом виде ПЧ запускается на 1с, не у верен что правильно поставил fbMbSerialRequest() и хотелось бы понять куда правильнее его установить.
Код://Проверка привода на готовоность
fbComControl1
(
xEnable := TRUE,
udiComPort := 5,
udiBaudrate := 9600,
udiByteSize := 8,
eParity := OCL.COM_PARITY.NONE,
eStopBit := OCL.COM_STOPBIT.ONE
);
IF fbComControl1.xActive THEN
IF xKnop THEN
eState := 20;
END_IF
IF xStop THEN
eState := 40;
END_IF
CASE eState OF
10: // Опрос состояния AFD-E
20: // запуск AFD-E
fbMbSerialRequest();
wCmdWord := 22;
fbMbSerialRequest.xExecute := TRUE;
fbMbSerialRequest.hCom := fbComControl1.hCom;
fbMbSerialRequest.xIsAsciiMode := FALSE;
fbMbSerialRequest.usiSlaveId := 15; //адрес слейва
fbMbSerialRequest.eFuncCode := OCL.MB_FC.WRITE_SINGLE_REGISTER ; //функция
fbMbSerialRequest.uiDataAddr := 4864; // адрес начального запроса
fbMbSerialRequest.uiDataCount := 1; //число регистров
fbMbSerialRequest.pData := ADR(wCmdWord);
fbMbSerialRequest.szSize := SIZEOF(wCmdWord);
//fbMbSerialRequest.xError := xError;
//fbMbSerialRequest.eError := wError;
xLampRab := TRUE;
xLampOff := FALSE;
30: // Реверс
wCmdWord := 54;
fbMbSerialRequest.usiSlaveId := 15; //адрес слейва
fbMbSerialRequest.eFuncCode := OCL.MB_FC.WRITE_SINGLE_COIL; //функция
fbMbSerialRequest.uiDataAddr := 4864; // адрес начального запроса
fbMbSerialRequest.uiDataCount := 1; //число регистров
fbMbSerialRequest.pData := ADR(wCmdWord);
fbMbSerialRequest.szSize := SIZEOF(wCmdWord);
xLampRab := TRUE;
xLampOff := FALSE;
40: // Стоп
wCmdWord := 166;
fbMbSerialRequest.usiSlaveId := 15; //адрес слейва
fbMbSerialRequest.eFuncCode := OCL.MB_FC.WRITE_SINGLE_COIL; //функция
fbMbSerialRequest.uiDataAddr := 4864; // адрес начального запроса
fbMbSerialRequest.uiDataCount := 1; //число регистров
fbMbSerialRequest.pData := ADR(wCmdWord);
fbMbSerialRequest.szSize := SIZEOF(wCmdWord);
xLampRab := FALSE;
xLampOff := TRUE;
IF fbMbSerialRequest.xDone OR fbMbSerialRequest.xError THEN
//xCommand := FALSE;
END_IF
END_CASE
ELSE
;
END_IF
Начните с этого:
Код:VAR
...
fbKnopTrig: R_TRIG;
END_VAR
// Проверка привода на готовность
fbComControl1
(
xEnable := TRUE,
udiComPort := 5,
udiBaudrate := 9600,
udiByteSize := 8,
eParity := OCL.COM_PARITY.NONE,
eStopBit := OCL.COM_STOPBIT.ONE
);
IF fbComControl1.xActive THEN
fbKnopTrig(CLK := xKnop);
IF fbKnopTrig.Q THEN
eState := 20;
END_IF
CASE eState OF
0: // ожидание команды
10: // Опрос состояния AFD-E
20: // запуск AFD-E
wCmdWord := 22;
fbMbSerialRequest.xExecute := TRUE;
fbMbSerialRequest.hCom := fbComControl1.hCom;
fbMbSerialRequest.xIsAsciiMode := FALSE;
fbMbSerialRequest.usiSlaveId := 15; // адрес слейва
fbMbSerialRequest.eFuncCode := OCL.MB_FC.WRITE_SINGLE_REGISTER; // функция
fbMbSerialRequest.uiDataAddr := 4864; // адрес начального запроса
fbMbSerialRequest.uiDataCount := 1; // число регистров
fbMbSerialRequest.pData := ADR(wCmdWord);
fbMbSerialRequest.szSize := SIZEOF(wCmdWord);
fbMbSerialRequest();
// fbMbSerialRequest.xError := xError;
// fbMbSerialRequest.eError := wError;
IF fbMbSerialRequest.xDone OR fbMbSerialRequest.xError THEN
fbMbSerialRequest(xExecute := FALSE);
eState := 0;
END_IF
END_CASE
END_IF
Спасибо дело сдвинулось с мертвой точки)
С Вашим кодом двигатель запускается на 1с, я правильно понимаю что бы запуск был постоянным надо постоянно отправлять запрос?
так будет правильно или есть более правильное написание кода с отправкой команды?Код:IF fbMbSerialRequest.xDone OR fbMbSerialRequest.xError THEN
fbMbSerialRequest(xExecute := FALSE);
eState := 20;
END_IF
Это должны специалисты по ПЧВ из нашей техподдержки пояснить. По моим воспоминаниям - при корректной настройке ПЧВ должно быть достаточно однократной отправки команды.Цитата:
С Вашим кодом двигатель запускается на 1с, я правильно понимаю что бы запуск был постоянным надо постоянно отправлять запрос?