―――――――――――――――――――――――――――――――――――――――――――― IF RTC.gbFlagServoExe = TRUE AND RTC.gbFlagContrInit = FALSE THEN IF RTC.giModeFBType = 1 THEN // PID fbPID( dIn := dErrPosUm * 1.0E-6, stTfState := RTC.gstFbState, stTf2Inf := RTC.gstPidInf, dOut => dFbOutN, stTfState1 => RTC.gstFbState ); ELSIF RTC.giModeFBType = 2 THEN // PD fbPD( dIn := dErrPosUm * 1.0E-6, stTfState := RTC.gstFbState, stTf1Inf := RTC.gstPdInf, dOut => dFbOutN, stTfState1 => RTC.gstFbState ); ELSE // Manual dFbOutN := DRV.gdRatedTorqueMn * dFbOutManualPercent * 1.0E-5; END_IF // Copyright(c) 2025 Koichi Sakata (SakaLib) VAR_INPUT dIn : LREAL; stTfState : TF_STATE; stTf2Inf : TF2_INF; END_VAR VAR_OUTPUT dOut : LREAL; stTfState1 : TF_STATE; END_VAR ――――――――――――――――――――――――――――――― dOut := stTf2Inf.dB[0] * dIn + stTf2Inf.dB[1] * stTfState.dInPre[0] + stTf2Inf.dB[2] * stTfState.dInPre[1] - stTf2Inf.dA[1] * stTfState.dOutPre[0] - stTf2Inf.dA[2] * stTfState.dOutPre[1]; stTfState.dInPre[1] := stTfState.dInPre[0]; stTfState.dInPre[0] := dIn; stTfState.dOutPre[1] := stTfState.dOutPre[0]; stTfState.dOutPre[0] := dOut; // Copy to output stTfState1 := stTfState; Function Block: FB_TF2_EXE Program: MAINの一部抜粋 離散時間伝達関数の計算をFunction Blockで 作成し、MAINの中で毎サイクル (125us)ぶん回す!