CoDeSys+( @@2.3.10.0@?@!4L +@ڗJ@qC:\TWINCAT\PLC\LIB\STANDARD.LIB@CONCATSTR1STR2CONCAT66CTDM Variable for CD Edge DetectionCD Count Down on rising edge LOAD Load Start Value PV Start Value Q  Counter reached 0 CV  Current Counter Value 66CTUM Variable for CU Edge Detection CU Count Up RESET Reset Counter to 0 PV Counter Limit Q  Counter reached the Limit CV  Current Counter Value 66CTUDMU Variable for CU Edge Detection MD Variable for CD Edge Detection CU Count Up CD Count Down RESET  Reset Counter to Null LOAD  Load Start Value PV  Start Value / Counter Limit QU Counter reached Limit QD Counter reached Null CV Current Counter Value 66DELETESTRLENPOSDELETE66F_TRIGM CLK Signal to detect Q Edge detected 66FINDSTR1STR2FIND66INSERTSTR1STR2POSINSERT66LEFTSTRSIZELEFT66LENSTRLEN66MIDSTRLENPOSMID66R_TRIGM CLK Signal to detect Q Edge detected 66REPLACESTR1STR2LPREPLACE66RIGHTSTRSIZERIGHT66RSSETRESET1Q1 66SEMAXCLAIM RELEASE BUSY 66SRSET1RESETQ1 66TOFM  internal variable StartTime internal variable IN? starts timer with falling edge, resets timer with rising edge PT time to pass, before Q is set Q 2 is FALSE, PT seconds after IN had a falling edge ET  elapsed time 66TONM  internal variable StartTime internal variable IN? starts timer with rising edge, resets timer with falling edge PT time to pass, before Q is set Q 0 is TRUE, PT seconds after IN had a rising edge ET  elapsed time 66TP StartTime  internal variable IN! Trigger for Start of the Signal PT' The length of the High-Signal in 10ms Q The pulse ET & The current phase of the High-Signal 66R@EVAL2POINTMODEEval2PointMode˛J@ EVALMCPANELfbStart2PointMode R_TRIG'fbStop2PointMode F_TRIG'˛J@LM_DEMO˛J@ 0 "& !#'$(KKKK +localhost¿w@p\wp w¿w>2@ @ZhZ\hZpZ\|||@@Op(O|8,,K@˛J/*BECKCONFI3*/ !@@3Standard !4LwdVAR_GLOBAL END_VAR ",BB_StandardLM_DEMO˛J$qqrrStandardڗJ ڗJUC ˛JVAR_CONFIG END_VAR ',,,IGlobale_Variablen˛J ˛Jr0VAR_GLOBAL LM_1_NodeState AT %IX1.0 : BOOL := FALSE; (* LinMot 1 Node state *) LM_1_StateVarWord AT %IW10 : WORD; (*State Var Word*) LM_1_StatusWord AT %IW12 : WORD; (*Status Word*) LM_1_WarnWord AT %IW14 : WORD; (*Warn Word*) LM_1_DemPos AT %ID20 : DINT; (*LM demand position monitoring *) LM_1_ActPos AT %ID24 : DINT; (*LM actual position monitoring *) LM_1_DemCurr AT %ID28 : DINT; (*LM demand current monitoring *) (* control word *) LM_1_CtrlWord AT %QW10 : WORD := 16#003F; (*Control Word *) (* Motion Command interface *) LM_MC_Header AT %QW12 : WORD; (* Motion Command Header *) LM_MC_HeaderLow AT %QB12 : BYTE; (* Motion Command Header low byte *) LM_MC_HeaderHigh AT %QB13 : BYTE; (* Motion Command Header high byte *) LM_1_MC_Par_1 AT %QD14 : DINT; (* Motion Command parameter 1 *) LM_1_MC_Par_2 AT %QD18 : DINT; (* Motion Command parameter 1 *) LM_1_MC_Par_3 AT %QD22 : DINT; (* Motion Command parameter 1 *) LM_1_MC_Par_4 AT %QD26 : DINT; (* Motion Command parameter 1 *) LM_1_MC_Par_5 AT %QD30 : DINT; (* Motion Command parameter 1 *) LM_1_AoENetIdArr AT%IB40 : ARRAY[0..5] OF BYTE; (* AoE NetID *) sArrMCStates : ARRAY[0..19] OF STRING(40) := 'Not Ready To Switch On', (* 0 *) 'Switch On Disabled', (* 1 *) 'Ready To Switch On', (* 2 *) 'Setup Error', (* 3 *) 'Error', (* 4 *) 'HW Tests', (* 5 *) 'Ready To Operate', (* 6 *) 'Setup Operation Enabled', (* 7 *) 'Operation Enabled', (* 8 *) 'Homing', (* 9 *) 'Clearance Checking', (* 10 *) 'Going To Initial Position', (* 11 *) 'Aborting', (* 12 *) 'Freezing', (* 13 *) 'Error Behavior Quick Stop', (* 14 *) 'Going To Position', (* 15 *) 'Jogging +', (* 16 *) 'Jogging -', (* 17 *) 'Linearizing', (* 18 *) 'Phase Searching'; (* 19 *) MainPrgState : UINT := 0; (* main programm state *) spStateVar : POINTER TO ST_StateVar; spVAI_MC_Par : POINTER TO ST_VAI_MOTION_CMD; TaskCounter : DINT := 0; (* Task counter for debugging *) (* Motion Panael variables =========================================================================================*) LM_DemPosFl : LREAL; (*LM demand position monitoring float *) LM_ActPosFl : LREAL; (*LM actual position monitoring float *) LM_DemCurrFl : LREAL; (*LM demand current monitoring float *) MC_Intf_RunMode : BYTE := 0; MC_Intf_RunModeState : BYTE := 0; MC_Intf_2P_Active : BOOL := FALSE; MC_Intf_2P_RC_CNT : DINT := 0; MC_Intf_2P_FC_CNT : DINT := 0; MC_Intf_WaitTimePos1 : TIME := T#1.0S; (* 1s *) MC_Intf_WaitTimePos2 : TIME := T#0.5S; (* 1s *) fbMC_Intf_WaitTimer : TON; MC_Intf_Pos_1Fl : LREAL := 0.0; (* 0mm *) MC_Intf_Pos_1 : DINT := 0; (* 0mm *) MC_Intf_MaxVel_1Fl : LREAL := 0.1; (* 0.1 m/s *) MC_Intf_MaxVel_1 : DINT := 0; (* 0m/s *) MC_Intf_Acc_1Fl : LREAL := 1.0; (* 1 m/s^2 *) MC_Intf_Acc_1 : DINT := 0; (* 0m/s *) MC_Intf_Dec_1Fl : LREAL := 1.0; (* 1 m/s^2 *) MC_Intf_Dec_1 : DINT := 0; (* 0m/s *) MC_Intf_Pos_2Fl : LREAL := 50.0; (* 50mm *) MC_Intf_Pos_2 : DINT := 500000; (* 50mm *) MC_Intf_MaxVel_2Fl : LREAL := 0.1; (* 0.1 m/s *) MC_Intf_MaxVel_2 : DINT := 0; (* 0m/s *) MC_Intf_Acc_2Fl : LREAL := 1.0; (* 1 m/s^2 *) MC_Intf_Acc_2 : DINT := 0; (* 0m/s *) MC_Intf_Dec_2Fl : LREAL := 1.0; (* 1 m/s^2 *) MC_Intf_Dec_2 : DINT := 0; (* 0m/s *) MC_Intf_Pos_IncFl : LREAL := 10.0; (* 10mm *) MC_Intf_Pos_Inc : DINT := 0; (* 0mm *) MC_Intf_MaxVel_IncFl : LREAL := 0.1; (* 0.1 m/s *) MC_Intf_MaxVel_Inc : DINT := 0; (* 0m/s *) MC_Intf_Acc_IncFl : LREAL := 1.0; (* 1 m/s^2 *) MC_Intf_Acc_Inc : DINT := 0; (* 0m/s *) MC_Intf_Dec_IncFl : LREAL := 1.0; (* 1 m/s^2 *) MC_Intf_Dec_Inc : DINT := 0; (* 0m/s *) END_VAR ' L_CSABEVariablen_Konfiguration˛J ˛J rVAR_CONFIG END_VAR |0|0@v@TMS Sans Serif@ HH':'mm':'ssdd'-'MM'-'yyyydd'-'MM'-'yyyy HH':'mm':'ss3DEFAULTSystem|0|0@v@TMS Sans Serif@ HH':'mm':'ssdd'-'MM'-'yyyydd'-'MM'-'yyyy HH':'mm':'ss HH':'mm':'ssdd'-'MM'-'yyyy' !,nnST_MC_GenMotionIntf˛J ˛J[TYPE ST_MC_GenMotionIntf: STRUCT MotionIntfHeader : WORD; MotionIntfPar : ARRAY [0..5] OF DWORD; END_STRUCT END_TYPE ", ST_StateVar˛J ˛J, ','0, `TYPE ST_StateVar: STRUCT LowByte : BYTE; HighByte : BYTE; END_STRUCT END_TYPE #,ST_VAI_MOTION_CMD˛J ˛JTYPE ST_VAI_MOTION_CMD: STRUCT Pos : DINT; (* position, new target position, incremnet, .. *) Vel : DINT; (* max velocity of VAI motion *) Acc : DINT; (* acceleration of VAI motion *) Dec : DINT; (* deceleration of VAI motion *) END_STRUCT END_TYPE &,EEval2PointModeЛJ ˛JMCar; M_@FUNCTION Eval2PointMode : BOOL VAR_INPUT END_VAR VAR END_VAR (* 2 point run state machine =======================*) CASE MC_Intf_RunModeState OF 0: (* start wait timer in position 1 *) fbMC_Intf_WaitTimer( IN := TRUE); fbMC_Intf_WaitTimer( IN := FALSE); fbMC_Intf_WaitTimer( IN := TRUE, PT := MC_Intf_WaitTimePos1); (* start wait timer pos 1 *) MC_Intf_RunModeState := MC_Intf_RunModeState +1; (* set next state *) 1: (* wait time if finished setup motion *) fbMC_Intf_WaitTimer(); IF( fbMC_Intf_WaitTimer.Q) THEN (* convert position max velocity acceleration and deceleration to LinMot units ================================================================*) MC_Intf_Pos_1 := LREAL_TO_DINT(MC_Intf_Pos_1FL*10000); MC_Intf_MaxVel_1 := LREAL_TO_DINT(MC_Intf_MaxVel_1FL*1000000); MC_Intf_Acc_1 := LREAL_TO_DINT(MC_Intf_Acc_1FL*100000); MC_Intf_Dec_1 := LREAL_TO_DINT(MC_Intf_Dec_1FL*100000); (* setup VAI motion command to position 1 ====================================*) spVAI_MC_Par^.Pos := MC_Intf_Pos_1; spVAI_MC_Par^.Vel := MC_Intf_MaxVel_1; spVAI_MC_Par^.Acc := MC_Intf_Acc_1; spVAI_MC_Par^.Dec := MC_Intf_Dec_1; LM_MC_Header := 16#0100 +1; (* VAI motion command count nibble := 1 *) MC_Intf_RunModeState := MC_Intf_RunModeState +1; (* set next state *) END_IF 2: (* wait until motion finished then setup wait time pos 1 *) IF( (LM_1_StatusWord.13 = FALSE) AND ((LM_1_StateVarWord AND 16#0F ) = 1) )THEN fbMC_Intf_WaitTimer( IN := FALSE); fbMC_Intf_WaitTimer( IN := TRUE, PT := MC_Intf_WaitTimePos1); (* start wait timer pos 1 *) MC_Intf_RunModeState := MC_Intf_RunModeState +1; (* set next state *) END_IF 3: (* wait time if finished setup motion *) fbMC_Intf_WaitTimer(); IF( fbMC_Intf_WaitTimer.Q) THEN (* convert position max velocity acceleration and deceleration to LinMot units ================================================================*) MC_Intf_Pos_2 := LREAL_TO_DINT(MC_Intf_Pos_2FL*10000); MC_Intf_MaxVel_2 := LREAL_TO_DINT(MC_Intf_MaxVel_2FL*1000000); MC_Intf_Acc_2 := LREAL_TO_DINT(MC_Intf_Acc_2FL*100000); MC_Intf_Dec_2 := LREAL_TO_DINT(MC_Intf_Dec_2FL*100000); (* setup VAI motion command to position 1 ====================================*) spVAI_MC_Par^.Pos := MC_Intf_Pos_2; spVAI_MC_Par^.Vel := MC_Intf_MaxVel_2; spVAI_MC_Par^.Acc := MC_Intf_Acc_2; spVAI_MC_Par^.Dec := MC_Intf_Dec_2; LM_MC_Header := 16#0100 +2; (* VAI motion command count nibble := 1 *) MC_Intf_RunModeState := MC_Intf_RunModeState +1; (* set next state *) END_IF 4: (* wait until motion finished then setup wait timer *) IF( (LM_1_StatusWord.13 = FALSE) AND ((LM_1_StateVarWord AND 16#0F ) = 2) ) THEN fbMC_Intf_WaitTimer( IN := FALSE); fbMC_Intf_WaitTimer( IN := TRUE, PT := MC_Intf_WaitTimePos2); (* start wait timer pos 2 *) MC_Intf_RunModeState := 1; (* set state1 *) END_IF ELSE ; END_CASE;', EvalMcPanelΛJ ˛JZPROGRAM EvalMcPanel VAR fbStart2PointMode: R_TRIG; fbStop2PointMode: F_TRIG; END_VARq(* on rising edge start 2 point mode on falling edge stop it ================================================*) fbStart2PointMode(CLK:=MC_Intf_2P_Active); IF (fbStart2PointMode.Q = TRUE) THEN MC_Intf_RunMode := 1; MC_Intf_RunModeState := 0; END_IF fbStop2PointMode(CLK:=MC_Intf_2P_Active); IF (fbStop2PointMode.Q = TRUE) THEN MC_Intf_RunMode := 0; MC_Intf_RunModeState := 0; END_IF (* main run mode switch of motion command panel ==========================================*) CASE MC_Intf_RunMode OF 0: (* idle state *) ; 1: (* 2 point run mode *) Eval2PointMode(); ELSE ; END_CASE; ,,,ILM_DEMO˛J ˛J'; PT 0PROGRAM LM_DEMO VAR END_VARTaskCounter := TaskCounter+1; CASE MainPrgState OF 0: (* Init state*) spStateVar := ADR(LM_1_StateVarWord); spVAI_MC_Par := ADR(LM_1_MC_Par_1); MainPrgState := MainPrgState + 1; (* set normal run state *) 1: (* 1 norml run state *) (* scale monitoring variables to float *) LM_DemPosFl := LM_1_DemPos*0.0001; LM_ActPosFl := LM_1_ActPos*0.0001; LM_DemCurrFl := LM_1_DemCurr*0.001; EvalMcPanel(); ELSE ; END_CASE; ,i CONTROL_PANEL˛J @#Kud4 @dynnLM_1_CtrlWord.0 0: Switch OnLM_1_CtrlWord.0@ @nLM_1_StatusWord.4 1: Safety Voltage EnableLM_1_CtrlWord.1@ @nLM_1_CtrlWord.2 2: / Quick StopLM_1_CtrlWord.2@ @nLM_1_CtrlWord.3 3: Enable OperationLM_1_CtrlWord.3@ @nLM_1_CtrlWord.4 4: /AbortArialLM_1_CtrlWord.4@ @nLM_1_CtrlWord.5 5: /FreezeLM_1_CtrlWord.5@ @-n"LM_1_CtrlWord.6 6: GoTo PositionLM_1_CtrlWord.6@ @6Kn@LM_1_CtrlWord.7 7: Error AcknowledgeArialLM_1_CtrlWord.7@ @Tin^LM_1_CtrlWord.8 8: Jog Move +LM_1_CtrlWord.8LM_1_CtrlWord.8@ @rn|LM_1_CtrlWord.9 9: Jog Move -LM_1_CtrlWord.9LM_1_CtrlWord.9@ @nLM_1_CtrlWord.10 10: Special ModeLM_1_CtrlWord.10@ @nLM_1_CtrlWord.11 11: HomeLM_1_CtrlWord.11@ @nLM_1_CtrlWord.12 12: Clearance Check LM_1_CtrlWord.12@ @nLM_1_CtrlWord.13 13: Go To Initial Position!LM_1_CtrlWord.13@ @nLM_1_CtrlWord.14 14: Linearizing"LM_1_CtrlWord.14@ @&;n0LM_1_CtrlWord.15 15: Phase Search#LM_1_CtrlWord.15@ @DcnS LM_1_CtrlWord Ctrl Word: %X)@ @dy,nLM_1_StatusWord.0 0: Operation EnabledB@ @,LM_1_StatusWord.1 1: Switch On ActiveC@ @,LM_1_StatusWord.2 2: Enable OperationD@ @,LM_1_StatusWord.3LM_1_StatusWord.3 3: ErrorE@ @,LM_1_StatusWord.4LM_1_StatusWord.4 4: Savety Volt. EnableF@ @,LM_1_StatusWord.5LM_1_StatusWord.5 5: /Quick StopG@ @-,"LM_1_StatusWord.6LM_1_StatusWord.6 6: Switch On LockedH@ @6K,@LM_1_StatusWord.7LM_1_StatusWord.7 7: WarningI@ @Ti,^LM_1_StatusWord.8LM_1_StatusWord.8 8: Event Handler ActiveJ@ @r,|LM_1_StatusWord.9LM_1_StatusWord.9 9: Special Motion ActiveK@ @,LM_1_StatusWord.10LM_1_StatusWord.10 10: In Target PositionL@ @,LM_1_StatusWord.11LM_1_StatusWord.11 11: HomedM@ @,LM_1_StatusWord.12LM_1_StatusWord.12 12: Fatal ErrorN@ @,LM_1_StatusWord.13LM_1_StatusWord.13 13: Motion ActiveO@ @,LM_1_StatusWord.14LM_1_StatusWord.14 14: Range Indicator 1P@ @&;,0LM_1_StatusWord.15LM_1_StatusWord.15 15: Range Indicator 2Q@ @Dc,SLM_1_StatusWord Status Word: %XR@ @dEynLM_1_WarnWord.0 0: Motor Hot Sensor^@ @ELM_1_WarnWord.1 1: Motor Short Time Overload_@ @ELM_1_WarnWord.2 2: Motor Supply Voltage Low`@ @ELM_1_WarnWord.3 3: Motor Supply Voltage Higha@ @ELM_1_WarnWord.4 4: Position Lag Alwaysb@ @ELM_1_WarnWord.5 5: Position Lag Standingc@ @E-"LM_1_WarnWord.6 6: Controller Hotd@ @6EK@LM_1_WarnWord.7 7: Motor Not Homede@ @TEi^LM_1_WarnWord.8 8: PTC 1f@ @rE|LM_1_WarnWord.9 9: PTC 2g@ @ELM_1_WarnWord.10 10: Reservedh@ @ELM_1_WarnWord.11 11: Reservedi@ @ELM_1_WarnWord.12 12: Reservedj@ @ELM_1_WarnWord.13 13: Reservedk@ @ELM_1_WarnWord.14 14: Interface Warn Flagl@ @&E;0LM_1_WarnWord.15 15: Application Warn Flagm@ @DEcS LM_1_WarnWord Warn Word: %Xn@ @<[,KLM_1_StateVarWord State Var: %Xq@ ,[ MAIN_PANEL˛J @I|c՛Jd @w@ @3 @ @ )F#Control Panel@@@ CONTROL_PANEL @4 )pLM_1_NodeStateLM_1_NodeState Node State: %s@ @ )"Motion Panel@@ @ MOTION_PANEL @D +)"sArrMCStates[spStateVar^.HighByte] State: %s@ $,,,I MOTION_PANEL˛J @initKd @ PMC_Intf_Pos_1Fl Pos 1 : %4.4f mm[@ @ ZyFiMC_Intf_2P_Active 2 Point ModeMC_Intf_2P_Active@ @ PMC_Intf_Pos_2Fl Pos 2 : %4.4f mm@ @ PMC_Intf_WaitTimePos2Wait: %s@ @ PMC_Intf_WaitTimePos1Wait: %s@ @<[HKLM_1_StateVarWord State Var: %X@ @H LM_ActPosFl Actual Pos : %4.4f mm@ @dHs LM_DemPosFl Demand Pos : %4.4f@ @H LM_DemCurrFl Dem Current : %2.3f A@ @ PMC_Intf_MaxVel_1Fl Max Vel: %4.4f m/s@ @ P MC_Intf_Acc_1Fl Acc : %4.4f m/s^2@ @ 7P'MC_Intf_Dec_1Fl Dec : %4.4f m/s^2@ @ PMC_Intf_MaxVel_2Fl Max Vel: %4.4f m/s@ @ PMC_Intf_Acc_2Fl Acc : %4.4f m/s^2@ @ P MC_Intf_Dec_2Fl Dec : %4.4f m/s^2@ @HMC_Intf_RunMode Run Mode : %i@ @HMC_Intf_RunModeState Run Mode State: %i@"STANDARD.LIB 5.6.98 13:03:02@fw5CONCAT@ CTD@ CTU@ CTUD@ DELETE@ F_TRIG@ FIND@ INSERT@ LEFT@ LEN@ MID@ R_TRIG@ REPLACE@ RIGHT@RS@ SEMA@SR@ TOF@ TON@TP@Global Variables 0@2 tt`u@r`ȒPOUsEval2PointMode& EvalMcPanel'LM_DEMO  Data typesST_MC_GenMotionIntf! ST_StateVar"ST_VAI_MOTION_CMD#Visualizations CONTROL_PANEL MAIN_PANEL MOTION_PANEL$Global VariablesGlobale_VariablenVariablen_Konfiguration ڗJ localhostP localhostP localhostPPL