Teemon Двумя вещами:
а) SysCom
б) Нормально написанным конечным автоматом для диммера.
Ща портировал на CDS v3.5, и при опросе 9 модулей IO всё пашет. Пока ещё тестирую.
Про планировщик, про прочее - позже будут посты. Сильно позже.
Да, запросы составляю вручную. Код примерно такой злой:
Код:IF (bPortR1Open = TRUE) THEN CASE iMBReqStateR1 OF iReqR1W2Msk: //ОПРОС МОДУЛЯ W1 - Маска Входов fbMbReqW2Msk( bEnable:= TRUE, hPort:= hPortR1, pCmdBuffer:= ADR(pBuffReqReadDIMaskW2), pCmdBufferLen:= SIZEOF(pBuffReqReadDIMaskW2), pRcvBuffer:= ADR(bfRecieveBuffer), pRcvBytesNeed:= wBuffAnswReadDIMaskW2, bCheckCRC:= TRUE, ); IF (fbMbReqW2Msk.bComplete = TRUE) THEN //Парсим данные в DWORD маски входов, если запрос завершился успешно iMBReqStateR1 := iReqR1W2Cnt; //Идём на следующий шаг iomW2DIMask := BYTE_TO_DWORD(bfRecieveBuffer[6]) //Входы 1-8 OR SHL(BYTE_TO_DWORD(bfRecieveBuffer[5]), 8*1) //Входы 9-16 OR SHL(BYTE_TO_DWORD(bfRecieveBuffer[4]), 8*2) //Входы 17-24 OR SHL(BYTE_TO_DWORD(bfRecieveBuffer[3]), 8*3); //Входы 25-32 END_IF ... ... ... ... ... IF (bPortR2Open = TRUE) THEN CASE iMBReqStateR2 OF iReqR2W5Out: //ОПРОС МОДУЛЯ W5 - Маска выходов !! bfSendBuffer[0] := 20; //Адрес bfSendBuffer[1] := 16#10; //Команда bfSendBuffer[2] := 16#00; //Старший (начальный адрес регистра) bfSendBuffer[3] := 16#61; //Младший (начальный адрес регистра) bfSendBuffer[4] := 16#00; //Старший (число регистров) bfSendBuffer[5] := 16#02; //Младший (число регистров) bfSendBuffer[6] := 4; //Число байт данных (далее) bfSendBuffer[7] := DWORD_TO_BYTE(SHR(wBitMask32W5, 8*3)); //16#FF; //Выходы 25-32 bfSendBuffer[8] := DWORD_TO_BYTE(SHR(wBitMask32W5, 8*2)); //16#FF; //Выходы 17-24 bfSendBuffer[9] := DWORD_TO_BYTE(SHR(wBitMask32W5, 8*1));// 16#FF; //Выходы 9-16 bfSendBuffer[10]:= DWORD_TO_BYTE(SHR(wBitMask32W5, 8*0));// 16#FF; //Выходы 1-8 CSMBAddBuffCRC(ADR(bfSendBuffer), SIZEOF(bfSendBuffer), 11); fbMbReqW5( bEnable:= TRUE, hPort:= hPortR2, pCmdBuffer:= ADR(bfSendBuffer), pCmdBufferLen:= 13, pRcvBuffer:= ADR(bfRecieveBuffer), pRcvBytesNeed:= wBuffAnswWriteDOMaskW5, bCheckCRC:= TRUE, ); IF (fbMbReqW5.bComplete = TRUE) THEN iMBReqStateR2 := iReqR2W6Out; END_IF


Ответить с цитированием
