calc_sequential.c
来自「CNC 的开放码,EMC2 V2.2.8版」· C语言 代码 · 共 179 行
C
179 行
/* Classic Ladder Project *//* Copyright (C) 2001-2006 Marc Le Douarain *//* http://www.multimania.com/mavati/classicladder *//* http://www.sourceforge.net/projects/classicladder *//* October 2002 *//* ---------------------------------- *//* Sequential language - Refresh page *//* ---------------------------------- *//* This library is free software; you can redistribute it and/or *//* modify it under the terms of the GNU Lesser General Public *//* License as published by the Free Software Foundation; either *//* version 2.1 of the License, or (at your option) any later version. *//* This library is distributed in the hope that it will be useful, *//* but WITHOUT ANY WARRANTY; without even the implied warranty of *//* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *//* Lesser General Public License for more details. *//* You should have received a copy of the GNU Lesser General Public *//* License along with this library; if not, write to the Free Software *//* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#ifdef MODULE#include <linux/string.h>#else#include <stdio.h>#include <string.h>#endif#include "classicladder.h"#include "global.h"#include "vars_access.h"#include "calc_sequential.h"void InitSequential( void ){ int NumStep; int NumTrans; int NumSwitch; int NumSeqComment; for( NumStep=0; NumStep<NBR_STEPS; NumStep++ ) { Sequential->Step[ NumStep ].InitStep = FALSE; Sequential->Step[ NumStep ].StepNumber = 0; Sequential->Step[ NumStep ].NumPage = -1; Sequential->Step[ NumStep ].PosiX = 0; Sequential->Step[ NumStep ].PosiY = 0; Sequential->Step[ NumStep ].Activated = FALSE; Sequential->Step[ NumStep ].TimeActivated = 0; Sequential->Step[ NumStep ].OffDrawCrossStep = 0; } for( NumTrans=0; NumTrans<NBR_TRANSITIONS; NumTrans++ ) { Sequential->Transition[ NumTrans ].VarTypeCondi = 0; Sequential->Transition[ NumTrans ].VarNumCondi = 0; for( NumSwitch=0; NumSwitch<NBR_SWITCHS_MAX; NumSwitch++ ) { Sequential->Transition[ NumTrans ].NumStepToActiv[ NumSwitch ] = -1; Sequential->Transition[ NumTrans ].NumStepToDesactiv[ NumSwitch ] = -1; Sequential->Transition[ NumTrans ].NumTransLinkedForStart[ NumSwitch ] = -1; Sequential->Transition[ NumTrans ].NumTransLinkedForEnd[ NumSwitch ] = -1; } Sequential->Transition[ NumTrans ].NumPage = -1; Sequential->Transition[ NumTrans ].PosiX = 0; Sequential->Transition[ NumTrans ].PosiY = 0; Sequential->Transition[ NumTrans ].Activated = FALSE; } for( NumSeqComment=0; NumSeqComment<NBR_SEQ_COMMENTS; NumSeqComment++ ) { Sequential->SeqComment[ NumSeqComment ].NumPage = -1; Sequential->SeqComment[ NumSeqComment ].PosiX = 0; Sequential->SeqComment[ NumSeqComment ].PosiY = 0; Sequential->SeqComment[ NumSeqComment ].Comment[ 0 ] = '\0'; }}/* set active all the init steps (called at start and after modification with the editor) */void PrepareSequential( void ){ int NumStep,NumTrans; for( NumStep=0; NumStep<NBR_STEPS; NumStep++ ) { Sequential->Step[ NumStep ].Activated = FALSE; Sequential->Step[ NumStep ].TimeActivated = 0; if ( Sequential->Step[ NumStep ].InitStep ) Sequential->Step[ NumStep ].Activated = TRUE; } for( NumTrans=0; NumTrans<NBR_TRANSITIONS; NumTrans++ ) Sequential->Transition[ NumTrans ].Activated = FALSE;}int RefreshTransi( StrTransition * pTransi ){ int HasChanged = FALSE; pTransi->Activated = ReadVar( pTransi->VarTypeCondi, pTransi->VarNumCondi ); /* Condi associated true ? */ if ( pTransi->Activated ) { int AllStepsOn = TRUE; int ScanStep = 0; /* Steps to desactivate are activated ? */ while( ScanStep<NBR_SWITCHS_MAX && pTransi->NumStepToDesactiv[ ScanStep ]!=-1 && AllStepsOn ) { if ( !Sequential->Step[ pTransi->NumStepToDesactiv[ ScanStep ] ].Activated ) AllStepsOn = FALSE; ScanStep++; } /* Transition is on ? */ if ( AllStepsOn ) { HasChanged = TRUE; /* Reset all the steps to desactivate */ ScanStep = 0; while( ScanStep<NBR_SWITCHS_MAX && pTransi->NumStepToDesactiv[ ScanStep ]!=-1 ) { Sequential->Step[ pTransi->NumStepToDesactiv[ ScanStep ] ].Activated = FALSE; ScanStep++; } /* Set all the steps to activate */ ScanStep = 0; while( ScanStep<NBR_SWITCHS_MAX && pTransi->NumStepToActiv[ ScanStep ]!=-1 ) { Sequential->Step[ pTransi->NumStepToActiv[ ScanStep ] ].Activated = TRUE; ScanStep++; } } } return HasChanged;}/* refresh vars of the steps (activity+time) */void RefreshStepsVars( void ){ int NumStep; for( NumStep=0; NumStep<NBR_STEPS; NumStep++ ) { if ( Sequential->Step[ NumStep ].Activated ) Sequential->Step[ NumStep ].TimeActivated += TIME_REFRESH_RUNG_MS; else Sequential->Step[ NumStep ].TimeActivated = 0; /* refresh the vars for the step number associated to this step */ WriteVar( VAR_STEP_ACTIVITY, Sequential->Step[ NumStep ].StepNumber, Sequential->Step[ NumStep ].Activated ); WriteVar( VAR_STEP_TIME, Sequential->Step[ NumStep ].StepNumber, Sequential->Step[ NumStep ].TimeActivated/1000 ); }}void RefreshSequentialPage( int PageNbr ){ int ScanTransi; StrTransition * pTransi; int StateChanged; int LoopSecurity = 0; /* we loop here while some transitions have changed of state */ do { StateChanged = FALSE; for( ScanTransi=0; ScanTransi<NBR_TRANSITIONS; ScanTransi++ ) { pTransi = &Sequential->Transition[ ScanTransi ]; /* transition for the page under refresh ? */ if( pTransi->NumPage==PageNbr ) { if ( RefreshTransi( pTransi ) ) StateChanged = TRUE; } } LoopSecurity++; } while( StateChanged && LoopSecurity<50 ); RefreshStepsVars( );}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?