有些同学用信捷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;
}