|
ECC工控组态软件脚本系统
Ecc的脚本采用C脚本和类似于java的虚拟机技术,由编译器编译成字节码,由虚拟机直接执行字节码。
1.效率很高,由于直接执行的是字节码,因此比VBScript等描述脚本效率要高。
2.功能十分强大,支持指针、数组、递归函数调用。
3.脚本分为图形脚本、窗口脚本、控制过程脚本。
4.内置函数包含数据访问类、图形控制类、画面(窗口)控制类、ActiveX访问类和标准ANSIC的一些函数(比如字符串处理、数学计算等)。
5.而且方便扩充内置函数,扩充内置函数时不需要修改编译系统。只需在虚拟机里定义扩充函数的实现即可。
6.虚拟机全部由标准C编写,可移植到嵌入设备、掌上电脑、UNIX等系统,支持不同CPU字节顺序的编译宏。该虚拟机成功的移植到摩托罗拉68系列CPU上,系统环境为256k内存,2MCPU主频,在该系统上虚拟机自身只占30K内存,可见虚拟机的效率。
下面是C脚本编写的例子代码:
1.CRC32计算
///////////////////////////////////////////////////////////////////////////
// CRC-32 校检算法
#define MB_OK 0x00000000
// 用于查表的数组
unsigned long crc32_table[256];
unsigned long Reflect(unsigned long ref, char ch)
{
int i;
unsigned long value = 0;
// bit 0 与 bit 7 交换
// bit 1 与 bit 6 交换,如此类推...
for(i = 1; i < (ch + 1); i++)
{
if (ref & 1)
value |= 1 << (ch - i);
ref >>= 1;
}
return value;
}
// 创建查表数组
void Init_CRC32_Table()
{
// 该 CRC-32 多项式算法广泛应用于 PKZip、WinZip 和 Ethernet 中
unsigned long ulPolynomial = 0x04c11db7;
int i, j;
for(i = 0; i <= 0xFF; i++)
{
crc32_table[i] = Reflect(i, 8) << 24;
for (j = 0; j < 8; j++)
crc32_table[i] = (crc32_table[i] << 1) ^
(crc32_table[i] & (1 << 31) ? ulPolynomial : 0);
crc32_table[i] = Reflect(crc32_table[i], 32);
}
}
unsigned long GetCRC32(unsigned char *szData, unsigned long dwSize)
{
unsigned long crc = 0xffffffff;
int len;
unsigned char* buffer = szData;
len = dwSize;
while(len--)
crc = (crc >> 8) ^ crc32_table[(crc & 0xFF) ^ *buffer++];
return crc^0xffffffff;
}
int main()
{
char buf[256];
char *ptr = "this is a CRC example!";
unsigned long CrcVal;
Init_CRC32_Table();
CrcVal = GetCRC32((unsigned char *)ptr, strlen(ptr));
sprintf(buf,"%s\nCRC value: %lX\n", ptr, CrcVal);
MessageBox(buf,”结果”, MB_OK);
return 0;
}
2、递归算法
////////////////////////////////////////////////////////////
// 函数递归示例
// 使用递归算法示 n+
#define MB_OK 0x00000000
unsigned long fac(unsigned long n)
{
unsigned long t;
if (n == 1 || n == 0)
return 1;
else {
t = n + fac(n - 1);
return t;
}
}
int main()
{
char buf[256];
unsigned long m = 150;
if (m < 0){
sprintf(buf,"Input data Error!\n");
MessageBox(buf,”结果”, MB_OK);
}
else {
unsigned long y = fac(m);
sprintf(buf,"%u+ = %d\n", m, y);
MessageBox(buf,”结果”, MB_OK);
}
return 0;
}
3、指针和指针运算
//字符串拷贝函数
#define MB_OK 0x00000000
void mystrcpy(char *d,char *s)
{
while(*s!=0) *d++=*s++;
}
// 主程序
int main()
{
char *ss = "this is test strcpy!";
char sd[256];
mystrcpy(sd,ss);
MessageBox(sd,”结果”, MB_OK);
return 0;
}
|