vars_access.c
来自「CNC 的开放码,EMC2 V2.2.8版」· C语言 代码 · 共 183 行
C
183 行
/* Classic Ladder Project *//* Copyright (C) 2001-2006 Marc Le Douarain *//* http://www.multimania.com/mavati/classicladder *//* http://www.sourceforge.net/projects/classicladder *//* February 2001 *//* --------------------------------------- *//* Access a variable for reading / writing *//* --------------------------------------- *//* 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 GTK_INTERFACE#include <gtk/gtk.h>#include "classicladder_gtk.h"#endif#if defined(MODULE) && defined(RTAI)#include <linux/kernel.h>#include <linux/module.h>#include "rtai.h"#else#include <stdio.h>#include <stdlib.h>#endif#include "classicladder.h"#include "global.h"void InitVars(void){ int NumVar; for (NumVar=0; NumVar<SIZE_VAR_ARRAY; NumVar++) VarArray[NumVar] = FALSE; for (NumVar=0; NumVar<SIZE_VAR_WORD_ARRAY; NumVar++) VarWordArray[NumVar] = 0; /* to tell the GTK application to refresh the bits */ InfosGene->CmdRefreshVarsBits = TRUE;}int ReadVar(int TypeVar,int Offset){ switch(TypeVar) { case VAR_MEM_BIT: return VarArray[Offset]; case VAR_TIMER_DONE: return TimerArray[Offset].OutputDone; case VAR_TIMER_RUNNING: return TimerArray[Offset].OutputRunning; case VAR_MONOSTABLE_RUNNING: return MonostableArray[Offset].OutputRunning; case VAR_COUNTER_DONE: return CounterArray[Offset].OutputDone; case VAR_COUNTER_EMPTY: return CounterArray[Offset].OutputEmpty; case VAR_COUNTER_FULL: return CounterArray[Offset].OutputFull;#ifdef SEQUENTIAL_SUPPORT case VAR_STEP_ACTIVITY:// return Sequential->Step[ Offset ].Activated; return VarArray[NBR_BITS+NBR_PHYS_INPUTS+NBR_PHYS_OUTPUTS+Offset];#endif case VAR_PHYS_INPUT: return VarArray[NBR_BITS+Offset]; case VAR_PHYS_OUTPUT: return VarArray[NBR_BITS+NBR_PHYS_INPUTS+Offset]; case VAR_MEM_WORD: return VarWordArray[Offset];#ifdef SEQUENTIAL_SUPPORT case VAR_STEP_TIME:// return Sequential->Step[ Offset ].TimeActivated/1000; return VarWordArray[NBR_WORDS+Offset];#endif case VAR_TIMER_PRESET: return TimerArray[Offset].Preset/TimerArray[Offset].Base; case VAR_TIMER_VALUE: return TimerArray[Offset].Value/TimerArray[Offset].Base; case VAR_MONOSTABLE_PRESET: return MonostableArray[Offset].Preset/MonostableArray[Offset].Base; case VAR_MONOSTABLE_VALUE: return MonostableArray[Offset].Value/MonostableArray[Offset].Base; case VAR_COUNTER_PRESET: return CounterArray[Offset].Preset; case VAR_COUNTER_VALUE: return CounterArray[Offset].Value; default: debug_printf("!!! Error : Type (=%d) not found in ReadVar()\n", TypeVar); } return 0;}void WriteVar(int TypeVar,int NumVar,int Value){ switch(TypeVar) { case VAR_MEM_BIT: VarArray[NumVar] = Value; break; case VAR_PHYS_INPUT: VarArray[NBR_BITS+NumVar] = Value; break; case VAR_PHYS_OUTPUT: VarArray[NBR_BITS+NBR_PHYS_INPUTS+NumVar] = Value; break;#ifdef SEQUENTIAL_SUPPORT case VAR_STEP_ACTIVITY: VarArray[NBR_BITS+NBR_PHYS_INPUTS+NBR_PHYS_OUTPUTS+NumVar] = Value; break;#endif case VAR_MEM_WORD: VarWordArray[NumVar] = Value; break;#ifdef SEQUENTIAL_SUPPORT case VAR_STEP_TIME: VarWordArray[NBR_WORDS+NumVar] = Value; break;#endif case VAR_TIMER_PRESET: TimerArray[NumVar].Preset = Value * TimerArray[NumVar].Base; break; case VAR_MONOSTABLE_PRESET: MonostableArray[NumVar].Preset = Value * MonostableArray[NumVar].Base; break; case VAR_COUNTER_DONE: CounterArray[NumVar].OutputDone = Value; break; case VAR_COUNTER_EMPTY: CounterArray[NumVar].OutputEmpty = Value; break; case VAR_COUNTER_FULL: CounterArray[NumVar].OutputFull = Value; break; case VAR_COUNTER_PRESET: CounterArray[NumVar].Preset = Value; break; case VAR_COUNTER_VALUE: CounterArray[NumVar].Value = Value; break; default: debug_printf("!!! Error : Type (=%d) not found in WriteVar()\n", TypeVar); break; } switch(TypeVar) { case VAR_MEM_BIT: case VAR_PHYS_INPUT: case VAR_PHYS_OUTPUT:// with a thread for all versions, do no more call a gtk function from this thread !////// // for Xenomai, do not do it now to avoid a domain mode switch !//////if defined( GTK_INTERFACE ) && !defined( __XENO__ )////// RefreshOneBoolVar( TypeVar, NumVar, Value );//////else /* to tell the GTK application to refresh the bits */ InfosGene->CmdRefreshVarsBits = TRUE;//////#endif break; }}void DumpVars(void){ int NumVar; for (NumVar=0; NumVar<20; NumVar++) debug_printf("Var %d=%d\n",NumVar,ReadVar(VAR_MEM_BIT,NumVar));}/* these are only useful for the MAT-connected version */void DoneVars(void) {}void CycleStart(void) {}void CycleEnd(void) {}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?