From 224fcbd7d245612c586f6700f85df854001df3d8 Mon Sep 17 00:00:00 2001 From: smaugain Date: Mon, 5 Jan 2026 14:55:28 +0100 Subject: [PATCH] First uplaod --- .vci/workspace.vci.config | 1 + fVarMcxVd.scl | 122 +++++++++++++++++++++++++++++++++ fVarMdxPd.scl | 141 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 264 insertions(+) create mode 100644 .vci/workspace.vci.config create mode 100644 fVarMcxVd.scl create mode 100644 fVarMdxPd.scl diff --git a/.vci/workspace.vci.config b/.vci/workspace.vci.config new file mode 100644 index 0000000..5bb31e3 --- /dev/null +++ b/.vci/workspace.vci.config @@ -0,0 +1 @@ +fr-FR \ No newline at end of file diff --git a/fVarMcxVd.scl b/fVarMcxVd.scl new file mode 100644 index 0000000..84b7fe6 --- /dev/null +++ b/fVarMcxVd.scl @@ -0,0 +1,122 @@ +FUNCTION_BLOCK "fVarMcxVd" +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 + VAR_INPUT + iADDR : HW_IO; + iSecu : Bool; + iEnable : Bool; + iRelBrake : Bool; + iJogP : Bool; + iJogN : Bool; + iNewPos : Bool; + iStart : Bool; + iReset : Bool; + iSelDrive2 : Bool; + iDisLimitSw : Bool; + iInhibit : Bool; + iStby : Bool; + iConsVit : UInt; + iAccel : UInt; + iDecel : UInt; + iwDo : Word; + iTpsSecu : Time := T#500MS; + END_VAR + + VAR_OUTPUT + oRdy : Bool; // Ready + oSto : Bool; // / Safe stop + oPow : Bool; // Powered + oNoBrake : Bool; // Brake released + oRot : Bool; // Motor turning + oRefOk : Bool; // Referenced + oNPosAcc : Bool; // New position accepted + oInPos : Bool; // Setpoint reached/ In position + oError : Bool; + oWarn : Bool; + oDrive2Active : Bool; + oComparCons : Bool; + oLimitSwDis : Bool; + oStbyOn : Bool; + oDefCom : Bool; + oRetVit : Int; + oCodeEtat : Word; + oCodeDef : Word; + oRetCouple : Int; + oDi : Word; + END_VAR + + VAR + PD { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + R { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..5] of Word; + W { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..5] of Word; + END_STRUCT; + TofSecu {InstructionName := 'TOF_TIME'; LibVersion := '1.0'; S7_SetPoint := 'False'} : TOF_TIME; + DefBitVie : "fDefBitVie"; + RReturn : Int; + WReturn : Int; + END_VAR + + +BEGIN + // Movitrac C Profinet en Velocity Drive + + //Lecture du bus + IF #iADDR > 0 THEN + #RReturn := DPRD_DAT(LADDR := #iADDR, RECORD => #PD.#R); + END_IF; + + // Lectures + #oRdy := #PD.R[1].%X0; + #oSto := #PD.R[1].%X1; + #oPow := #PD.R[1].%X2; + #oNoBrake := #PD.R[1].%X3; + #oRot := #PD.R[1].%X4; + #oRefOk := #PD.R[1].%X5; + #oNPosAcc := #PD.R[1].%X6; + #oInPos := #PD.R[1].%X7; + #oError := #PD.R[1].%X8; + #oWarn := #PD.R[1].%X9; + #oDrive2Active := #PD.R[1].%X10; + #oComparCons := #PD.R[1].%X11; + #oLimitSwDis := #PD.R[1].%X12; + #oStbyOn := #PD.R[1].%X14; + // Le bit 15 est recopié en interne dans le var + #DefBitVie(iIn := #PD.R[1].%X15, iDelai := T#2s, oDef => #oDefCom); + #oRetVit := WORD_TO_INT(#PD.R[2]); + IF #oError THEN + #oCodeEtat := 0; + #oCodeDef := #PD.R[3]; + ELSE + #oCodeEtat := #PD.R[3]; + #oCodeDef := 0; + END_IF; + #oRetCouple := WORD_TO_INT(#PD.R[4]); + #oDi := #PD.R[5]; + + // Ecritures + #PD.R[1] := 0; // Raz bit reserve + #TofSecu(IN := #iSecu, PT := #iTpsSecu); + #PD.W[1].%X0 := #TofSecu.Q; + #PD.W[1].%X1 := #iEnable; + #PD.W[1].%X3 := #iRelBrake; + #PD.W[1].%X4 := #iJogP; + #PD.W[1].%X5 := #iJogN; + #PD.W[1].%X6 := #iNewPos; + #PD.W[1].%X7 := #iStart; + #PD.W[1].%X8 := #iReset AND #oError; + #PD.W[1].%X10 := #iSelDrive2; + #PD.W[1].%X12 := #iDisLimitSw; + #PD.W[1].%X13 := #iInhibit; + #PD.W[1].%X14 := #iStby; + #PD.W[1].%X15 := "Clock_2Hz"; + #PD.W[2] := UINT_TO_WORD(#iConsVit); + #PD.W[3] := UINT_TO_WORD(#iAccel); + #PD.W[4] := UINT_TO_WORD(#iDecel); + #PD.W[5] := #iwDo; + + //Ecriture sur bus + IF #iADDR > 0 THEN + #WReturn := DPWR_DAT(LADDR := #iADDR, RECORD := #PD.#W); + END_IF; +END_FUNCTION_BLOCK + diff --git a/fVarMdxPd.scl b/fVarMdxPd.scl new file mode 100644 index 0000000..4889364 --- /dev/null +++ b/fVarMdxPd.scl @@ -0,0 +1,141 @@ +FUNCTION_BLOCK "fVarMdxPd" +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 + VAR_INPUT + iADDR : HW_IO; + iSecu : Bool; + iEnable : Bool; + iRelBrake : Bool; + iJogP : Bool; + iJogN : Bool; + iNewPos : Bool; + iStart : Bool; + iReset : Bool; + iSelDrive2 : Bool; + iDisLimitSw : Bool; + iInhibit : Bool; + iStby : Bool; + iConsVit : UInt; + iAccel : UInt; + iDecel : UInt; + iwDo : Word; + iMode : Int; + iConsPos : DInt; + iTpsSecu : Time := T#500MS; + END_VAR + + VAR_OUTPUT + oRdy : Bool; // Ready + oSto : Bool; // / Safe stop + oPow : Bool; // Powered + oNoBrake : Bool; // Brake released + oRot : Bool; // Motor turning + oRefOk : Bool; // Referenced + oNPosAcc : Bool; // New position accepted + oInPos : Bool; // Setpoint reached/ In position + oError : Bool; + oWarn : Bool; + oDrive2Active : Bool; + oComparCons : Bool; + oLimitSwDis : Bool; + oStbyOn : Bool; + oDefCom : Bool; + oRetVit : Int; + oCodeEtat : Word; + oCodeDef : Word; + oRetCouple : Int; + oDi : Word; + oActMode : Int; + oActPos : DInt; + END_VAR + + VAR + PD { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct + R { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..8] of Word; + W { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..8] of Word; + END_STRUCT; + TofSecu {InstructionName := 'TOF_TIME'; LibVersion := '1.0'; S7_SetPoint := 'False'} : TOF_TIME; + DefBitVie : "fDefBitVie"; + RReturn : Int; + WReturn : Int; + END_VAR + + +BEGIN + // MOVIDRIVE C en positioning drive + // Mode 100 Jog position, 101 Jog vitesse (Mode 100, arrêt sur fdc, mode 101, arrêt après fdc) + // Mode 200 Velocity + // Mode 300 Reference via parameter + // Mode 301 Reference via iConsPos + // Mode 400 Absolute pos + // Mode 401 Relative pos + // Mode 402 Modulo pos + // Mode 403 Modulo neg + // Mode 404 Modulo short + + //Lecture du bus + IF #iADDR > 0 THEN + #RReturn := DPRD_DAT(LADDR := #iADDR, RECORD => #PD.#R); + END_IF; + + // Lectures + #oRdy := #PD.R[1].%X0; + #oSto := #PD.R[1].%X1; + #oPow := #PD.R[1].%X2; + #oNoBrake := #PD.R[1].%X3; + #oRot := #PD.R[1].%X4; + #oRefOk := #PD.R[1].%X5; + #oNPosAcc := #PD.R[1].%X6; + #oInPos := #PD.R[1].%X7; + #oError := #PD.R[1].%X8; + #oWarn := #PD.R[1].%X9; + #oDrive2Active := #PD.R[1].%X10; + #oComparCons := #PD.R[1].%X11; + #oLimitSwDis := #PD.R[1].%X12; + #oStbyOn := #PD.R[1].%X14; + // Le bit 15 est recopié en interne dans le var + #DefBitVie(iIn := #PD.R[1].%X15, iDelai := T#2s, oDef => #oDefCom); + #oRetVit := WORD_TO_INT(#PD.R[2]); + IF #oError THEN + #oCodeEtat := 0; + #oCodeDef := #PD.R[3]; + ELSE + #oCodeEtat := #PD.R[3]; + #oCodeDef := 0; + END_IF; + #oRetCouple := WORD_TO_INT(#PD.R[4]); + #oDi := #PD.R[5]; + #oActMode := WORD_TO_INT(#PD.R[6]); + // Retour position retracte 8 LOW et 7 HIGH + #oActPos := (SHL(IN := WORD_TO_DINT(#PD.R[7]), N := 16)) + #PD.R[8]; + + // Ecritures + #PD.R[1] := 0; // Raz bit reserve + #TofSecu(IN := #iSecu, PT := #iTpsSecu); + #PD.W[1].%X0 := #TofSecu.Q; + #PD.W[1].%X1 := #iEnable; + #PD.W[1].%X3 := #iRelBrake; + #PD.W[1].%X4 := #iJogP; + #PD.W[1].%X5 := #iJogN; + #PD.W[1].%X6 := #iNewPos; + #PD.W[1].%X7 := #iStart; + #PD.W[1].%X8 := #iReset AND #oError; + #PD.W[1].%X10 := #iSelDrive2; + #PD.W[1].%X12 := #iDisLimitSw; + #PD.W[1].%X13 := #iInhibit; + #PD.W[1].%X14 := #iStby; + #PD.W[1].%X15 := "Clock_2Hz"; // Handshake aller + #PD.W[2] := UINT_TO_WORD(#iConsVit); + #PD.W[3] := UINT_TO_WORD(#iAccel); + #PD.W[4] := UINT_TO_WORD(#iDecel); + #PD.W[5] := #iwDo; + #PD.W[6] := INT_TO_WORD(#iMode); + #PD.W[7] := DWORD_TO_WORD(SHR(IN := DINT_TO_DWORD(#iConsPos), N := 16)); // HIGH + #PD.W[8] := DWORD_TO_WORD(DINT_TO_DWORD(#iConsPos) AND 16#0000FFFF); // LOW + + //Ecriture sur bus + IF #iADDR > 0 THEN + #WReturn := DPWR_DAT(LADDR := #iADDR, RECORD := #PD.#W); + END_IF; +END_FUNCTION_BLOCK +