Download this file
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
FUNCTION_BLOCK MEGAIO_FB EXTENDS i2c VAR_INPUT stIn : IoDrvInput; stCfg : IoDrvConfig; END_VAR VAR_OUTPUT stOut : IoDrvOutput; 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; VAR_TEMP i, usi: USINT; buff: ARRAY[0..2] OF USINT; SUPER^(); CASE _iState OF 0: usiAddress := stCfg.i2cAddress; IF usiAddress < 16#31 OR usiAddress > 16#34 THEN usiAddress := 16#31; END_IF //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