PLC的C语言编程

上传人:飞*** 文档编号:47769090 上传时间:2018-07-04 格式:PDF 页数:12 大小:483.58KB
返回 下载 相关 举报
PLC的C语言编程_第1页
第1页 / 共12页
PLC的C语言编程_第2页
第2页 / 共12页
PLC的C语言编程_第3页
第3页 / 共12页
PLC的C语言编程_第4页
第4页 / 共12页
PLC的C语言编程_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《PLC的C语言编程》由会员分享,可在线阅读,更多相关《PLC的C语言编程(12页珍藏版)》请在金锄头文库上搜索。

1、2、C 语言功能块本章重点介绍C 语言编辑功能块的特点、编辑、 指令调用、 函数的存储、 应用要点等,并附有常用函数列表。2-1、功能概述XCP 新增功能,支持用户在XCP Pro 编程软件中利用C 语言编写功能块,在需要的地方进行调用,其最大的优点是支持几乎所有的C 语言函数,增强了程序的保密性,同时由于可进行多处调用和不同文件的调用,大大提高了编程人员的效率。2-2、指令形式N A M E_CD 0M 0X 0S1 S2 S3 2-1功能概述2-2指令形式2-3操作步骤2-4函数的导入、导出2-5功能块的编辑2-6程序举例2-7应用要点2-8附函数表:C 语言函数功能块名称,由用户自定义。

2、:对应 C 语言函数内字W 的起始地址,只能为寄存器D。:对应 C 语言函数内位B 的起始地址,只能为内部线圈M。适用于 XC 系列 PLC V3.0C及以上版本, XC1 、XC3 、XC5 都支持。名称由数字,英文,下划线组成,首字符不能为数字,名称长度需=9个字符。名称不能与 PLC 内置指令名称冲突,如LD,ADD,SUB,PLSR 等。名称不能与当前PLC 已经存在的函数功能块同名。2-3、操作步骤1、打开PLC 编辑软件,在左侧的“工程”工具栏内选择“函数功能块”,右击选择“添加新函数功能块” 。2、出现如下对话框,填写所要编辑函数的信息。S3S1S23、在新建完成后,会出现下面的

3、编辑画面。参数传递方式:在梯形图调用时,传入的D和M ,即为 W 和B的起始地址。如上图 D0,M0开始,则 W0 为D0 ,W10 为D10,B0为 M0, B10为 M10 。如梯形图中使用的参数为D100,M100 ,则W0 为D100,B 0为M100 。因此, 字与位元件的首地址由用户在PLC程序中设定。编辑者名称功能块命名 之间为 C 语言程序编辑区域主函数名称(为函数功能块名称该名称不能随意修改,必须在编辑窗口进行修改)WORD W 对应为软元件D BIT B 对应为软元件M 参数 W : 表示字软元件, 使用时按数组使用,如W0=1;W1=W2+W3;在程序中可按照标准 C规范

4、使用。参数 B: 表示位软元件, 使用时也按数组使用,支持位置 1和位清零, 如B0=1;B1=0; 以及赋值,如B0=B1。双字运算 : 在W 前加个 D,如 DW10=100000,表示给 W10W11 合成的双字赋值。浮点运算 : 支持在函数中定义浮点变量,以及进行浮点运算。函数库: 用户功能块可以直接使用函数库中定义的函数和常量,函数库中包含的函数和常量见后附部分。支持的其他数据类型: BOOL; / 布尔量INT8U; /8 位无符号整数INT8S; /8 位有符号整数INT16U /16 位无符号整数INT16S /16 位有符号整数INT32U /32 位无符号整数INT32S

5、/32 位有符号整数FP32; / 单精度浮点FP64; / 双精度浮点预定义的宏:#define true 1 #define false 0 #define TRUE 1 #define FALSE 0 2-4、函数的导入、导出1、导出(1)功能:将函数导出为文件,供其他PLC 程序导入用。(2)导出方式a)可编辑 : 将源代码也导出,并保存为文件再次导入后,可再次编辑b)不可编辑 : 源代码不导出再次导入后只可使用,无法编辑2、导入功能:导入已存在的函数功能块文件,供该PLC 程序使用。选中函数功能块,右键点击菜单“从硬盘导入函数功能块文件“,选择相应文件, 按确定即可。2-5、功能块的

6、编辑例: 将PLC 中寄存器 D0,D1相加,然后将值赋给D2;(1)首先在“工程”工具栏里,新建一个函数功能块,在这里我们把它命名为ADD_2 ,并且编辑 C语言程序。(2)编辑完之后,点击编译;、根据编译信息列表内所显示的信息,我们可以查找修改C 语言程序里的语法漏洞。在这里比较容易的发现程序中W2=W0+W1的后面缺少符号“; ” 。编译信息列表当我们将程序修改后,再次进行编译。 从列表信息里可以确认,在程序里面并没有语法错误。(3)然后再编写PLC 程序,分别赋值十进制数10,20 到寄存器D0,D1 中,并调用函数功能块 ADD_2。如下所示:(4)然后将程序下载到PLC 当中,运行

7、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、) ,将 8-bit全部运算完成。( 6)重复(2)到(5) ,取下一个8-bit的讯息指令, 直到所有讯息指令运算完成。最后,得到的 CRC寄存器的值, 即是 CRC的校验码。 值得注意的是CRC的校验码必须交换放置与讯息指令的检查码中。编辑 C 语言功能块程序,如下:编写 PLC梯形图程序,D0:校验数据的字节个数,D1D5:校验数据的内容。如下:下载到 PLC里,然后运行, 使 M0置 ON,通过自由监控就会发现寄存器D6 ,D7内分别存入了 CRC校验值的高位与底位。2-7、应用要点使用函数功能块的PLC 程序,上传后该函数功能块无法上传,将出现一个未知指令错误。一个函数功能块文件内部

9、,可以写多个子函数,进行相互调用。多个函数功能块文件彼此独立,不能相互调用各自拥有的函数。函数功能块文件可以调用浮点,算术等C语言库函数 , 如sin,cos,tan。2-8、附函数表默认函数库常量名数据说明_LOG2 (double)0.693147180559945309417232121458 2的对数_LOG10 (double)2.3025850929940459010936137929093 10的对数_SQRT2 (double)1.41421356237309504880168872421 根号 2 _PI (double)3.1415926535897932384626433

10、832795 PI _PIP2 (double)1.57079632679489661923132169163975 PI/2 _PIP2x3 (double)4.71238898038468985769396507491925 PI*3/2 字符串函数说明void * memchr(const void *s, int c, size_t n); 传回 s位置开始前 n个字元第一次出现字元 c的位置指标 .int memcmp(const void *s1, const void *s2, size_t n); 比较位置 s1和位置 s2的前 n个字元 .void * memcpy(void

11、 *s1, const void *s2, size_t n); 从位置 s2复制 n个字元到位置s1,传回 s1.void * memset(void *s, int c, size_t n); 取代 s位置开始前 n个字元成为字元c,传回位置指标 s.char * strcat(char *s1, const char *s2); 连结字串 ct到字串 s之后 .char * strchr(const char *s, int c); 传回字元 c第一次出现在字串s位置的指标 .int strcmp(const char *s1, const char *s2); 比较字串 s1和s2.c

12、har * strcpy(char *s1, const char *s2); 将字串 s1复制到字串 s2.双精度数学函数单精度数学函数说明double acos(double x); float acosf(float x); 反余弦函数 .double asin(double x); float asinf(float x); 反正弦函数 .double atan(double x); float atanf(float x); 反正切函数 .double atan2(double y, double x); float atan2f(float y, float x); 参数 y/x的

13、反正切函数值.double ceil(double x); float ceilf(float x); 传 回 大於 或 等於 参数 x 的最 小double整数 .double cos(double x); float cosf(float x); 余弦函数 .double cosh(double x); float coshf(float x); hyperbolic 余弦函数 , cosh(x)=(ex+e(-x)/2.double exp(double x); float expf(float x); 自然数的指数ex.double fabs(double x); float fabs

14、f(float x); 传回参数 x的绝对值 .double floor(double x); float floorf(float x); 传 回 小於 或 等於 参数 x 的最 大double整数 .double fmod(double x, double y); float fmodf(float x, float y); 如果 y为非零值,传回浮点数x/y的余数 .double frexp(double val, int _far *exp); float frexpf(float val, int _far *exp); 将参数 x的浮点数分解成尾数和指标 ,x = m*2exp,

15、传回 m值的尾数,将指数存入参数exp.double ldexp(double x, int exp); float ldexpf(float x, int exp); x乘以 2的n次方是 x*2n.double log(double x); float logf(float x); 自然对数 logxdouble log10(double x); float log10f(float x); 十为底的对数log10x.double modf(double val, double *pd); float modff(float val, float *pd); 将浮点数 x分解成整数和小数部

16、分,传回小数部分,将整数部分存入参数 ip.double pow(double x, double y); float powf(float x, float y); 传回参数x为底 ,参数 y的次方值xy.double sin(double x); float sinf(float x); 正弦函数 .double sinh(double x); float sinhf(float x); Hyperbolic 正弦函数 , sinh(x)=(ex-e(-x)/2. double sqrt(double x); float sqrtf(float x); 参数 x的平方根 .double tan(double x); float tanf(float x); 正切函数 .double tanh(double x); float tanhf(float x); hyperbolic 正

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号