1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | FUNCTION_BLOCK MEGAIO EXTENDS i2c VAR_INPUT udtConfig : IoDrvConfig; // Configuration udtOutput : IoDrvOutput; // Contains DO/AO END_VAR VAR_OUTPUT udtInput : IoDrvInput; // Contains DI/AI VAR timer: TON := (IN:=TRUE); dacRawValue: UINT :=0; relayRaw: USINT :=0; odRaw: USINT := 0; odLastState: ARRAY[0..3] OF BOOL; gpioDirRaw: USINT := 16#FF; gpioOutLastState: ARRAY[0..5] OF BOOL; _byHardwareAddress: BYTE; //StackLevel: USINT; _AfterReadInputs : UINT; _BeforeWriteOutputs : UINT; _Initialize : UINT; VAR_TEMP i, usi: USINT; buff: ARRAY[0..2] OF USINT; SUPER^(); CASE _iState OF 0: IF usiAddress = 0 THEN usiAddress := _byHardwareAddress; END_IF IF usiAddress < 16#31 OR usiAddress > 16#34 THEN usiAddress := 16#31; //usiAddress := 16#31 + StackLevel; IF SUPER^.init() THEN _iState := 5; END_IF 5: Timer.pt := T#70MS; buff[0] := MEGAIO_DAC_ADD; buff[1] := 0; buff[2] := 0; // init DAC 0.0V write(ADR(buff), 3); // init all relay off write8(0, relayRaw); // set all gpio input write8(GPIO_DIR_ADD, gpioDirRaw); // set all open drain write8(MEGAIO_OD_ADD, odRaw); _iState := 10; END_CASE |