📄 equll.c
字号:
/**********************************************************
filename : equ.c
equation calculation for PLC controller
designed by Pei-Chong Tang, March 1992
data format : bit=<data:1>, byte=<data:1>
word=<data:2>, long=<data:4>
address format : <4-byte>
command format :
nCHANGE : CHANGE reg #N from type #Y to type #X (N=2*5*5=50)
nLOAD_K : LOAD constant of type #X to reg #R (N=2*5=10)
nLOAD_V : LOAD variable of type #X to reg #R (N=2*5=10)
nLOAD_P : LOAD pointer of type #X to reg #R (N=2*5=10)
nSAVE_V : SAVE r1 to a variable of type #X (N=5)
nSAVE_P : SAVE r1 #1 to a pointer of type #X (N=5)
nPUSH : PUSH r1 as type #XX (N=5)
nPOP : POP r2 as type #XX (N=5)
nMOVE : MOVE r1 to r2 (N=5)
nAND_BIT : AND bitwise, r1=r1&r2 (N=5)
nOR_BIT : OR bitwise, r1=r1|r2 (N=5)
nXOR_BIT : XOR bitwise, r1=r1^r2 (N=5)
nNOT_BIT : NOT bitwise, r1=~r1 (N=5)
nADD : ADDITION, r1=r1+r2 (N=5)
nSUB : SUBTRACT, r1=r2-r1 (N=5)
nMUL : MULTIPLY, r1=r1*r2 (N=5)
nDIV : DIVISION, r1=r2/r1 (N=5)
nREM : REMAIN, r1=r2%r1 (N=5)
nNEG : NEGATIVE, r1=-r1 (N=5)
nSHIFT_LEFT : SHIFT LEFT, r1=r2<<r1 (N=5)
nSHIFT_RIGHT : SHIFT RIGHT, r1=r2>>r1 (N=5)
nGREAT_THAN : GREAT THAN, r1=(r2>r1)?255:0 (N=5)
nGREAT_EQUAL : GREAT EQUAL, r1=(r2>=r1)?255:0 (N=5)
nLESS_THAN : LESS THAN, r1=(r2<r1)?255:0 (N=5)
nLESS_EQUAL : LESS EQUAL, r1=(r2<=r1)?255:0 (N=5)
nEQUAL : EQUAL, r1=(r1==r2)?255:0 (N=5)
nNOT_EQUAL : NOT EQUAL, r1=(r1!=r2)?255:0 (N=5)
nAND_LOGIC : AND logical, r1=r1&&r2 (N=1)
nOR_LOGIC : AND logical, r1=r1||r2 (N=1)
nNOT_LOGIC : AND logical, r1=!r1 (N=1)
nMIN : MINIMUM, r1=min(r1,r2) (N=5)
nMAX : MAXIMUM, r1=max(r1,r2) (N=5)
nABS : ABSOLUTE, r1=abs(r1) (N=5)
nSWAP : SWAP all bits, r1=swap(r1) (N=5)
nBCD : BINARY to BCD, r1=bcd(r1) (N=5)
nBINARY : BCD to BINARY, r1=bin(r1) (N=5)
nPARITY : PARITY, r1=parity(r1) (N=5)
nCHANGE : to BIT, r1=bit(r1)
nCHANGE : to BYTE, r1=char(r1)
nCHANGE : to WORD, r1=int(r1)
nCHANGE : to LONG, r1=long(r1)
nCHANGE : to FLOAT, r1=float(r1)
nACOS : ACOS, r1=acos(r1) (N=1)
nASIN : ASIN, r1=asin(r1) (N=1)
nATAN : ATAN, r1=atan(r1) (N=1)
nATAN2 : ATAN2, r1=atan2(r1,r2) (N=1)
nCOSH : COSH, r1=acos(r1) (N=1)
nCOS : COS, r1=cos(r1) (N=1)
nEXP : EXP, r1=exp(r1) (N=1)
nLOG10 : LOG10, r1=log10(r1) (N=1)
nLOG : LOG, r1=log(r1) (N=1)
nPOW10 : POW10, r1=pow10(r1) (N=1)
nSIN : SIN, r1=sin(r1) (N=1)
nSINH : SINH, r1=sinh(r1) (N=1)
nSQRT : SQRT, r1=sqrt(r1) (N=1)
nTAN : TAN, r1=tan(r1) (N=1)
nTIME : TIME NOW, r1=time() (N=1)
nRANDOM : RANDOM value, r1=random() (N=1)
nEND : END (N=1)
**********************************************************/
#include "eMSP.h"
#include "plc.h"
//***** definition of data type *****
#define BIT 0
#define CHR 1
#define INT 2
#define LNG 3
#define dBIT 0
#define dCHR 1
#define dINT 2
#define dLNG 3
#define sBIT 0
#define sCHR 10
#define sINT 20
#define sLNG 30
//***** definition of registers *****
#define REG1 0
#define REG2 5
//***** definition of commands *****
#define nCHANGE 0
#define nLOAD_K 50
#define nLOAD_V 60
#define nLOAD_P 70
#define nSAVE_V 80
#define nSAVE_ACC 85
#define nPOP 90
#define nPUSH 95
#define nMOVE 100
#define nAND_BIT 105
#define nOR_BIT 110
#define nXOR_BIT 115
#define nNOT_BIT 120
#define nADD 125
#define nSUB 130
#define nMUL 135
#define nDIV 140
#define nREM 145
#define nNEG 150
#define nSHIFT_LEFT 155
#define nSHIFT_RIGHT 160
#define nGREAT_THAN 165
#define nLESS_THAN 170
#define nGREAT_EQUAL 175
#define nLESS_EQUAL 180
#define nEQUAL 185
#define nNOT_EQUAL 190
#define nAND_LOGIC 195
#define nOR_LOGIC 196
#define nNOT_LOGIC 197
#define nMIN 200
#define nMAX 205
#define nABS 210
#define nSWAP 215
#define nBCD 220
#define nBINARY 225
#define nPARITY 230
#define nTIME 235
#define nRANDOM 236
#define nACOS 237
#define nASIN 238
#define nATAN 239
#define nATAN2 240
#define nCOSH 241
#define nCOS 242
#define nEXP 243
#define nLOG 244
#define nLOG10 245
#define nPOW10 246
#define nSIN 247
#define nSINH 248
#define nSQRT 249
#define nTAN 250
#define nTC 251
#define nTI 252
#define nTL 253
#define nTF 254
static union {unsigned char c; int i; long l;} r1,r2;
//*********************************************************
// EQU_function()
// equation calculation
//*********************************************************
static unsigned char getByte(unsigned char *);
static unsigned getWord(unsigned char *);
static long getLong(unsigned char *);
static void putByte(unsigned char *,unsigned char);
static void putWord(unsigned char *,unsigned);
static void putLong(unsigned char *,long);
void EQU_function(unsigned char *p)
{ static unsigned int rand=1;
unsigned char buf[16]; unsigned char *s,*next;
next=p+(*(p+1));
p+=2; s=buf; //**reset stack
while (1)
{ if (p>=next) return;
switch (*p++)
{ //**change format
case nCHANGE+REG1+sBIT+dBIT : break;
case nCHANGE+REG1+sBIT+dCHR : break;
case nCHANGE+REG1+sBIT+dINT : r1.i=r1.c; break;
case nCHANGE+REG1+sBIT+dLNG : r1.l=r1.c; break;
case nCHANGE+REG1+sCHR+dBIT : r1.c=(r1.c)?255:0; break;
case nCHANGE+REG1+sCHR+dCHR : break;
case nCHANGE+REG1+sCHR+dINT : r1.i=r1.c; break;
case nCHANGE+REG1+sCHR+dLNG : r1.l=r1.c; break;
case nCHANGE+REG1+sINT+dBIT : r1.c=(r1.i)?255:0; break;
case nCHANGE+REG1+sINT+dCHR : break;
case nCHANGE+REG1+sINT+dINT : break;
case nCHANGE+REG1+sINT+dLNG : r1.l=r1.i; break;
case nCHANGE+REG1+sLNG+dBIT : r1.c=(r1.l)?255:0; break;
case nCHANGE+REG1+sLNG+dCHR : break;
case nCHANGE+REG1+sLNG+dINT : break;
case nCHANGE+REG1+sLNG+dLNG : break;
//**change format
case nCHANGE+REG2+sBIT+dBIT : break;
case nCHANGE+REG2+sBIT+dCHR : break;
case nCHANGE+REG2+sBIT+dINT : r2.i=r2.c; break;
case nCHANGE+REG2+sBIT+dLNG : r2.l=r2.c; break;
case nCHANGE+REG2+sCHR+dBIT : r2.c=(r2.c)?255:0; break;
case nCHANGE+REG2+sCHR+dCHR : break;
case nCHANGE+REG2+sCHR+dINT : r2.i=r2.c; break;
case nCHANGE+REG2+sCHR+dLNG : r2.l=r2.c; break;
case nCHANGE+REG2+sINT+dBIT : r2.c=(r2.i)?255:0; break;
case nCHANGE+REG2+sINT+dCHR : break;
case nCHANGE+REG2+sINT+dINT : break;
case nCHANGE+REG2+sINT+dLNG : r2.l=r2.i; break;
case nCHANGE+REG2+sLNG+dBIT : r2.c=(r2.l)?255:0; break;
case nCHANGE+REG2+sLNG+dCHR : break;
case nCHANGE+REG2+sLNG+dINT : break;
case nCHANGE+REG2+sLNG+dLNG : break;
//**load constant
case nLOAD_K+REG1+BIT : r1.c=getByte(p); p++; break;
case nLOAD_K+REG1+CHR : r1.c=getByte(p); p++; break;
case nLOAD_K+REG1+INT : r1.i=getWord(p); p+=2; break;
case nLOAD_K+REG1+LNG : r1.l=getLong(p); p+=4; break;
case nLOAD_K+REG2+BIT : r2.c=getByte(p); p++; break;
case nLOAD_K+REG2+CHR : r2.c=getByte(p); p++; break;
case nLOAD_K+REG2+INT : r2.i=getWord(p); p+=2; break;
case nLOAD_K+REG2+LNG : r2.l=getLong(p); p+=4; break;
//**load variable
case nLOAD_V+REG1+BIT :
case nLOAD_V+REG1+CHR :
case nLOAD_V+REG1+INT :
case nLOAD_V+REG1+LNG : r1.l=PLCgetData(getLong(p)); p+=4; break;
case nLOAD_V+REG2+BIT :
case nLOAD_V+REG2+CHR :
case nLOAD_V+REG2+INT :
case nLOAD_V+REG2+LNG : r2.l=PLCgetData(getLong(p)); p+=4; break;
//**load pointer
case nLOAD_P+REG1+BIT :
case nLOAD_P+REG1+CHR :
case nLOAD_P+REG1+INT :
case nLOAD_P+REG1+LNG : r1.l=PLCgetData(getLong(p)); p+=4; break;
case nLOAD_P+REG2+BIT :
case nLOAD_P+REG2+CHR :
case nLOAD_P+REG2+INT :
case nLOAD_P+REG2+LNG : r2.l=PLCgetData(getLong(p)); p+=4; break;
//**save variable
case nSAVE_ACC+BIT : RAM_PLCacc=(r1.c)?255:0; p++; break;
case nSAVE_ACC+CHR : RAM_PLCacc=(r1.c)?255:0; p++; break;
case nSAVE_ACC+INT : RAM_PLCacc=(r1.i)?255:0; p++; break;
case nSAVE_ACC+LNG : RAM_PLCacc=(r1.l)?255:0; p++; break;
case nSAVE_V+BIT :
case nSAVE_V+CHR :
case nSAVE_V+INT :
case nSAVE_V+LNG : PLCputData(getLong(p),r1.l); p+=4; break;
//***** push into stack *****
case nPUSH+BIT : putByte(s,r1.c); s++; break;
case nPUSH+CHR : putByte(s,r1.c); s++; break;
case nPUSH+INT : putWord(s,r1.i); s+=2; break;
case nPUSH+LNG : putLong(s,r1.l); s+=4; break;
//***** pop from stack *****
case nPOP+BIT : s--; r2.c=getByte(s); break;
case nPOP+CHR : s--; r2.c=getByte(s); break;
case nPOP+INT : s-=2; r2.i=getWord(s); break;
case nPOP+LNG : s-=4; r2.l=getLong(s); break;
//***** move r1 to r2 *****
case nMOVE+BIT : r2.c=r1.c; break;
case nMOVE+CHR : r2.c=r1.c; break;
case nMOVE+INT : r2.i=r1.i; break;
case nMOVE+LNG : r2.l=r1.l; break;
//***** bitwise AND *****
case nAND_BIT+BIT : r1.c&=r2.c; break;
case nAND_BIT+CHR : r1.c&=r2.c; break;
case nAND_BIT+INT : r1.i&=r2.i; break;
case nAND_BIT+LNG : r1.l&=r2.l; break;
//***** bitwise OR *****
case nOR_BIT+BIT : r1.c|=r2.c; break;
case nOR_BIT+CHR : r1.c|=r2.c; break;
case nOR_BIT+INT : r1.i|=r2.i; break;
case nOR_BIT+LNG : r1.l|=r2.l; break;
//***** bitwise XOR *****
case nXOR_BIT+BIT : r1.c^=r2.c; break;
case nXOR_BIT+CHR : r1.c^=r2.c; break;
case nXOR_BIT+INT : r1.i^=r2.i; break;
case nXOR_BIT+LNG : r1.l^=r2.l; break;
//***** bitwise NOT *****
case nNOT_BIT+BIT : r1.c=~r1.c; break;
case nNOT_BIT+CHR : r1.c=~r1.c; break;
case nNOT_BIT+INT : r1.i=~r1.i; break;
case nNOT_BIT+LNG : r1.l=~r1.l; break;
//***** ADD *****
case nADD+BIT : break;
case nADD+CHR : r1.c+=r2.c; break;
case nADD+INT : r1.i+=r2.i; break;
case nADD+LNG : r1.l+=r2.l; break;
//***** SUB *****
case nSUB+BIT : break;
case nSUB+CHR : r1.c=r2.c-r1.c; break;
case nSUB+INT : r1.i=r2.i-r1.i; break;
case nSUB+LNG : r1.l=r2.l-r1.l; break;
//***** MUL *****
case nMUL+BIT : break;
case nMUL+CHR : r1.c*=r2.c; break;
case nMUL+INT : r1.i*=r2.i; break;
case nMUL+LNG : r1.l*=r2.l; break;
//***** DIV *****
case nDIV+BIT : break;
case nDIV+CHR : r1.c=r2.c/r1.c; break;
case nDIV+INT : r1.i=r2.i/r1.i; break;
case nDIV+LNG : r1.l=r2.l/r1.l; break;
//***** REM *****
case nREM+BIT : break;
case nREM+CHR : r1.c=r2.c%r1.c; break;
case nREM+INT : r1.i=r2.i%r1.i; break;
case nREM+LNG : r1.l=r2.l%r1.l; break;
//***** NEG *****
case nNEG+BIT : break;
case nNEG+CHR : r1.c=-r1.c; break;
case nNEG+INT : r1.i=-r1.i; break;
case nNEG+LNG : r1.l=-r1.l; break;
//***** shift LEFT *****
case nSHIFT_LEFT+BIT : break;
case nSHIFT_LEFT+CHR : r1.c=r2.c<<r1.c; break;
case nSHIFT_LEFT+INT : r1.i=r2.i<<r1.c; break;
case nSHIFT_LEFT+LNG : r1.l=r2.l<<r1.c; break;
//***** shift RIGHT *****
case nSHIFT_RIGHT+BIT : break;
case nSHIFT_RIGHT+CHR : r1.c=r2.c>>r1.c; break;
case nSHIFT_RIGHT+INT : r1.i=r2.i>>r1.c; break;
case nSHIFT_RIGHT+LNG : r1.l=r2.l>>r1.c; break;
//***** great than *****
case nGREAT_THAN+BIT : r1.c=(r2.c>r1.c)?255:0; break;
case nGREAT_THAN+CHR : r1.c=(r2.c>r1.c)?255:0; break;
case nGREAT_THAN+INT : r1.c=(r2.i>r1.i)?255:0; break;
case nGREAT_THAN+LNG : r1.c=(r2.l>r1.l)?255:0; break;
//***** less than *****
case nLESS_THAN+BIT : r1.c=(r2.c<r1.c)?255:0; break;
case nLESS_THAN+CHR : r1.c=(r2.c<r1.c)?255:0; break;
case nLESS_THAN+INT : r1.c=(r2.i<r1.i)?255:0; break;
case nLESS_THAN+LNG : r1.c=(r2.l<r1.l)?255:0; break;
//***** great equal *****
case nGREAT_EQUAL+BIT : r1.c=(r2.c>=r1.c)?255:0; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -