信捷PLC的C语言程序写法例子

   有些同学用信捷PLC的C函数功能块,不想受函数参数的约束,想随便用寄存器是数值来做计算。可以把需要参与计算的数据放在一个结构体里面,把结构体声明在头文件里面,然后结构体里面再嵌套结构体指针来指向另外的寄存器的地址。这样就可以不使用连续的寄存器了。类似于链表,举例如下:

#ifndef FUNC1__H

#define FUNC1__H

//内部数据变量定义
#define  SRW(A) (*(INT16S *)  &W[A])  // D寄存器16位有符号
#define  URW(A) (*(INT16U *)  &W[A])  // D寄存器16位无符号
#define  SRD(A) (*(INT32S *)  &W[A])  // D寄存器32位有符号
#define  URD(A) (*(INT32U *)  &W[A])  // D寄存器32位无符号
#define  FRD(A) (*(FP32   *)  &W[A])  // D寄存器32位浮点型

//01位数据变量定义
#define  XB(A) X[A]   //X
#define  YB(A) Y[A]   //Y
#define  MB(A) M[A]   //M
#define  SB(A) S[A]   //S
#define  TB(A) T[A]   //T
#define  CB(A) C[A]   //C

//16位数据变量定义
#define   SDW(A) (*(INT16S *)   &D[A])  //  D寄存器16位有符号
#define   UDW(A) (*(INT16U *)   &D[A])  //  D寄存器16位无符号
#define  SHDW(A) (*(INT16S *)  &HD[A])  // HD寄存器16位有符号
#define  UHDW(A) (*(INT16U *)  &HD[A])  // HD寄存器16位无符号
#define   STW(A) (*(INT16S *)  &TD[A])  // TD寄存器16位有符号
#define   UTW(A) (*(INT16U *)  &TD[A])  // TD寄存器16位无符号
#define  SHTW(A) (*(INT16S *) &HTD[A])  //HTD寄存器16位有符号
#define  UHTW(A) (*(INT16U *) &HTD[A])  //HTD寄存器16位无符号
#define   SCW(A) (*(INT16S *)  &CD[A])  // CD寄存器16位有符号
#define   UCW(A) (*(INT16U *)  &CD[A])  // CD寄存器16位无符号
#define  SHCW(A) (*(INT16S *) &HCD[A])  //HCD寄存器16位有符号
#define  UHCW(A) (*(INT16U *) &HCD[A])  //HCD寄存器16位无符号

//32位数据变量定义
#define   SDD(A) (*(INT32S *)   &D[A])  //  D寄存器32位有符号
#define   UDD(A) (*(INT32U *)   &D[A])  //  D寄存器32位无符号
#define   FDD(A) (*(FP32   *)   &D[A])  //  D寄存器32位浮点型
#define  SHDD(A) (*(INT32S *)  &HD[A])  // HD寄存器32位有符号
#define  UHDD(A) (*(INT32U *)  &HD[A])  // HD寄存器32位无符号
#define  FHDD(A) (*(FP32   *)  &HD[A])  // HD寄存器32位浮点型
#define   STD(A) (*(INT32S *)  &TD[A])  // TD寄存器32位有符号
#define   UTD(A) (*(INT32U *)  &TD[A])  // TD寄存器32位无符号
#define   FTD(A) (*(FP32   *)  &TD[A])  // TD寄存器32位浮点型
#define  SHTD(A) (*(INT32S *) &HTD[A])  //HTD寄存器32位有符号
#define  UHTD(A) (*(INT32U *) &HTD[A])  //HTD寄存器32位无符号
#define  FHTD(A) (*(FP32   *) &HTD[A])  //HTD寄存器32位浮点型
#define   SCD(A) (*(INT32S *)  &CD[A])  // CD寄存器32位有符号
#define   UCD(A) (*(INT32U *)  &CD[A])  // CD寄存器32位无符号
#define   FCD(A) (*(FP32   *)  &CD[A])  // CD寄存器32位浮点型
#define  SHCD(A) (*(INT32S *) &HCD[A])  //HCD寄存器32位有符号
#define  UHCD(A) (*(INT32U *) &HCD[A])  //HCD寄存器32位无符号
#define  FHCD(A) (*(FP32   *) &HCD[A])  //HCD寄存器32位浮点型 
#define FHC(A) (*(FP32   *)&HCD[A])       //32位浮点类型HCD寄存器

typedef struct{
int test1;
int test2;
int test3;
} STtest2;

typedef struct {
int test1;
int *test2;
int *test3;
STtest2 *STtest2c;/*第一个结构体的指针类型变量*/

} STtest;

#endif

#include"func1.h"

void FUNC2(PINT16S W,BIT B,INT16U WA,BIT WG)
{
    #define SysRegAddr_HD_D_HM_M/*每个函数内部必须宏定义寄存器变量*/
   STtest2 *PTEST =(STtest2*) (&D[50]);/*把D50地址给结构体,然后D50开始的寄存器就是结构体元素的第一个数值,以此类推*/
   PTEST->test1 = 1;
   PTEST->test2 = 123456789;
   SDD(0)=( int * ) (&D[70]);
   SDD ( 2 ) = PTEST->test2;
   PTEST->test2[0] = 10;
   PTEST->test2[1] = 15;
   PTEST->test3 = 934567891;
}

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值