2024年3月25日发(作者:电脑cpu100%怎么解决)
2、C语言功能块
本章重点介绍C语言编辑功能块的特点、、编辑、指令调用、函数的存储、应用要点等,
并附有常用函数列表。
2-1.功能概述
2-2.指令形式
2-3.操作步骤
2-4.函数的导入、导出
2-5.功能块的编辑
2-6.程序举例
2-7.应用要点
2-8.附函数表
2-1、功能概述
XCP新增功能,支持用户在XCP Pro编程软件中利用C语言编写功能块,在需要的地
方进行调用,其最大的优点是支持几乎所有的C语言函数,增强了程序的保密性,同时由
于可进行多处调用和不同文件的调用,大大提高了编程人员的效率。
2-2、指令形式
X0
S1·
S2·S3·
NAME_CD0M0
S1·
:C语言函数功能块名称,由用户自定义。
S2·
:对应C语言函数内字W的起始地址,只能为寄存器D。
S3·
:对应C语言函数内位B的起始地址,只能为内部线圈M。
适用于XC系列PLC V3.0C及以上版本,XC1、XC3、XC5都支持。
名称由数字,英文,下划线组成,首字符不能为数字,名称长度需<=9个字符。
名称不能与PLC内置指令名称冲突,如LD,ADD,SUB,PLSR等。
名称不能与当前PLC已经存在的函数功能块同名。
2-3、操作步骤
1、打开PLC编辑软件,在左侧的“工程”工具栏内选择“函数功能块”,右击选择“添加
新函数功能块”。
2、出现如下对话框,填写所要编辑函数的信息。
功能块命名
编辑者名称
3、在新建完成后,会出现下面的编辑画面。
主函数名称(为函数功能
块名称.该名称不能随意
修改,必须在编辑窗口进
行修改)
‘{}’之间为C语
WORD W 对应为软元件D
言程序编辑区域
BIT B 对应为软元件M
参数传递方式: 在梯形图调用时,传入的D和M,即为W和B的起始地址。如上图 D0,M0
开始,则W[0]为D0,W[10]为D10,B[0]为M0, B[10]为M10。如梯形图中使用的参数
为D100,M100,则W[0]为D100,B[0]为M100。因此,字与位元件的首地址由用户在PLC
程序中设定。
参数W: 表示字软元件,使用时按数组使用,如W[0]=1;W[1]=W[2]+W[3];在程序中可按
照标准C规范使用。
参数B: 表示位软元件,使用时也按数组使用,支持位置1和位清零,如B[0]=1;B[1]=0;
以及赋值,如B[0]=B[1]。
双字运算: 在W前加个D,如DW[10]=100000,表示给W[10]W[11]合成的双字赋值。
浮点运算: 支持在函数中定义浮点变量,以及进行浮点运算。
函数库:用户功能块可以直接使用函数库中定义的函数和常量,函数库中包含的函数和
常量见后附部分。
支持的其他数据类型:
BOOL;
INT8U;
INT8S;
INT16U
INT16S
INT32U
INT32S
FP32;
FP64;
预定义的宏:
#define
#define
#define
#define
true
false
TRUE
FALSE
1
0
1
0
//布尔量
//8位无符号整数
//8位有符号整数
//16位无符号整数
//16位有符号整数
//32位无符号整数
//32位有符号整数
//单精度浮点
//双精度浮点
2-4、函数的导入、导出
1、导出
(1)功能:将函数导出为文件,供其他PLC程序导入用。
(2)导出方式
a)可编辑:将源代码也导出,并保存为文件.再次导入后,可再次编辑
b)不可编辑:源代码不导出.再次导入后只可使用,无法编辑
2、导入
功能:导入已存在的函数功能块文件,供该PLC程序使用。
选中函数功能块,右键点击菜单"从硬盘导入函数功能块文件",选择相应文件,按确定
即可。
2-5、功能块的编辑
例:将PLC中寄存器D0,D1相加,然后将值赋给D2;
(1)首先在“工程”工具栏里,新建一个函数功能块,在这里我们把它命名为ADD_2,并且
编辑C语言程序。
(2)编辑完之后,点击编译;
、
编译信息列表
根据编译信息列表内所显示的信息,我们可以查找修改C语言程序里的语法漏洞。在
这里比较容易的发现程序中W[2]=W[0]+W[1]的后面缺少符号“;”。
当我们将程序修改后,再次进行编译。从列表信息里可以确认,在程序里面并没有语法
错误。
(3)然后再编写PLC程序,分别赋值十进制数10,20到寄存器D0,D1中,并调用函数
功能块ADD_2。如下所示:
(4)然后将程序下载到PLC当中,运行PLC,并置位M0。
(5)我们可以通过工具栏上的自由监控观察到D2的值变成了30,说明赋值成功了。
自由监控
2-6、程序举例
功能:利用函数功能块计算出CRC校验值。
CRC校验运算规则如下:
(1)令16-bit寄存器(CRC寄存器)=FFFFH。
(2)将第一个8-bit byte 的讯息与低位元16-bit CRC寄存器异或(Exclusive OR)内。
(3)右移一位CRC寄存器,将0填入高位元处。
(4)检查右移的值,如果是0,就将第三步的新值存入CRC寄存器内,如果为非0,那么
将CRC寄存器的值与A001H异或,将结果存入CRC寄存器内。
(5)重复(3)到(4),将8-bit全部运算完成。
(6)重复(2)到(5),取下一个8-bit的讯息指令,直到所有讯息指令运算完成。最后,
得到的CRC寄存器的值,即是CRC的校验码。值得注意的是CRC的校验码必须交换放
置与讯息指令的检查码中。
编辑C语言功能块程序,如下:
编写PLC梯形图程序,D0:校验数据的字节个数,D1~D5:校验数据的内容。如下:
下载到PLC里,然后运行,使M0置 ON,通过自由监控就会发现寄存器D6 ,D7内分别
存入了CRC校验值的高位与底位。
2-7、应用要点
使用函数功能块的PLC程序,上传后.该函数功能块无法上传,将出现一个未知指令错
误。
一个函数功能块文件内部,可以写多个子函数,进行相互调用。
多个函数功能块文件彼此独立,不能相互调用各自拥有的函数。
函数功能块文件可以调用浮点,算术等C语言库函数,如sin,cos,tan。
2-8、附函数表
默认函数库
常量名
_LOG2
_LOG10
_SQRT2
_PI
_PIP2
_PIP2x3
数据
(double)0.6931458
(double)2.3459093
(double)1.472421
(double)3.97932384626433832795
(double)1.576663975
(double)4.707491925
说明
2的对数
10的对数
根号2
PI
PI/2
PI*3/2
字符串函数
void * memchr(const void *s, int c, size_t n);
说明
传回s位置开始前n个字元第一次出
现字元c的位置指标.
从位置s2复制n个字元到位置s1,传
回s1.
取代s位置开始前n个字元成为字元
c,传回位置指标s.
连结字串ct到字串s之后.
传回字元c第一次出现在字串s位置
的指标.
比较字串s1和s2.
将字串s1复制到字串s2.
int memcmp(const void *s1, const void *s2, size_t n); 比较位置s1和位置s2的前n个字元.
void * memcpy(void *s1, const void *s2, size_t n);
void * memset(void *s, int c, size_t n);
char * strcat(char *s1, const char *s2);
char * strchr(const char *s, int c);
int strcmp(const char *s1, const char *s2);
char * strcpy(char *s1, const char *s2);
双精度数学函数
double acos(double x);
double asin(double x);
double atan(double x);
单精度数学函数
float acosf(float x);
float asinf(float x);
float atanf(float x);
反余弦函数.
反正弦函数.
反正切函数.
说明
double atan2(double y, double
float atan2f(float y, float x); 参数y/x的反正切函数值.
x);
double ceil(double x);
double cos(double x);
double cosh(double x);
double exp(double x);
double fabs(double x);
double floor(double x);
float ceilf(float x);
float cosf(float x);
float coshf(float x);
float expf(float x);
float fabsf(float x);
float floorf(float x);
传回大於或等於参数x的最小
double整数.
余弦函数.
hyperbolic余弦函数,
cosh(x)=(e^x+e^(-x))/2.
自然数的指数e^x.
传回参数x的绝对值.
传回小於或等於参数x的最大
double整数.
double fmod(double x, double 如果y为非零值,传回浮点数x/y
float fmodf(float x, float y);
y); 的余数.
将参数x的浮点数分解成尾数和
double frexp(double val, int float frexpf(float val, int
指标,x = m*2^exp,传回m值的尾
_far *exp); _far *exp);
数,将指数存入参数exp.
double ldexp(double x, int float ldexpf(float x, int
x乘以2的n次方是x*2^n.
exp); exp);
double log(double x);
double log10(double x);
double modf(double
double *pd);
float logf(float x);
float log10f(float x);
自然对数logx
十为底的对数log10x.
将浮点数x分解成整数和小数部
val, float modff(float val, float
分,传回小数部分,将整数部分存
*pd);
入参数ip.
传回参数x为底,参数y的次方值
x^y.
double pow(double x, double
float powf(float x, float y);
y);
double sin(double x);
double sinh(double x);
double sqrt(double x);
double tan(double x);
double tanh(double x);
float sinf(float x);
float sinhf(float x);
float sqrtf(float x);
float tanf(float x);
float tanhf(float x);
正弦函数.
Hyperbolic正弦函数,
sinh(x)=(e^x-e^(-x))/2.
参数x的平方根.
正切函数.
hyperbolic正切函数,
tanh(x)=(e^x-e^(-x))/(e^2+e^(-x)).
三、运动控制
发布者:admin,转转请注明出处:http://www.yc00.com/xitong/1711336514a1887555.html
评论列表(0条)