打开
停产版本---查看--》工程文件窗口--》往上拖到最高--》触摸屏
数据类型
新版本 工程结构窗口---下拉 ---宏文件
宏编辑设置路径失败
宏代码变量窗口
触发
元件-数据传输-定时器
寄存器地址
调用子程序
基础
![](https://img-blog.csdnimg.cn/direct/ce9de8925ccd4b88aa81d41b8a0fe2b3.png)
案例一 刷卡系统
//判断登录
int MacroEntry()
{
char buf[10]="";
char kahao[10]="";
short flag[1]={0};
ReadLocal("LW",8900,5, (void*)kahao, 0);
ReadLocal("RW",100,5, (void*)buf, 0);
short i;
for (i=0;i<15;i++) //在15组用户密码中对比
{
ReadLocal("RW", 100+5*i, 5, (void*)buf, 0);
if (((strcmp(kahao,buf))==0)&&(strlen(kahao)>0))
{
loginuser=5*(i+1);//算出来偏移地址
quanxian=shouquan[i];//把对应用户的权限赋值
WriteLocal("LB", 8999, 1, (void*)flag, 0);
tanchuang=0;
break;
}
else
{
if(strlen(kahao)>0) tanchuang=1;
}
}
return 0;
}
//退出登录
int MacroEntry()
{
char buf[10]="";
WriteLocal("LW", 8900, 5, (void*)buf, 0);
flag=0;
return 0;
}
多屏互锁
//HMI1
int MacroEntry()
{
if (locker & BitMask(0)) //本机被锁
{
int unlockVal = 6;
int reqVal = BitMask(0);
if (!(locker & BitMask(1)))
{
if (!WriteData(reqHmi1, 0, 0, 1, &reqVal)) //发送请求
{
WriteData(locker, 1, 0, 1, &unlockVal); //对方掉线,强制解锁
}
}
if (!(locker & BitMask(2)))
{
if (!WriteData(reqHmi2, 0, 0, 1, &reqVal))
{
WriteData(locker, 1, 0, 1, &unlockVal); //对方掉线,强制解锁
}
}
}
return 0;
}
//HMI2
#define BitMask(i) (1<<(i))
int MacroEntry()
{
if (locker & BitMask(1)) //本机被锁
{
int unlockVal = 5;
int reqVal = BitMask(1);
if (!(locker & BitMask(0)))
{
if (!WriteData(reqHmi0, 0, 0, 1, &reqVal)) //发送请求
{
WriteData(locker, 1, 0, 1, &unlockVal); //对方掉线,强制解锁
}
}
if (!(locker & BitMask(2)))
{
if (!WriteData(reqHmi2, 0, 0, 1, &reqVal))
{
WriteData(locker, 1, 0, 1, &unlockVal); //对方掉线,强制解锁
}
}
}
return 0;
}
//HMI3
#define BitMask(i) (1<<(i))
int MacroEntry()
{
if (locker & BitMask(2)) //本机被锁
{
int unlockVal = 3;
int reqVal = BitMask(2);
if (!(locker & BitMask(0)))
{
if (!WriteData(reqHmi0, 0, 0, 1, &reqVal)) //发送请求
{
WriteData(locker, 1, 0, 1, &unlockVal); //对方掉线,强制解锁
}
}
if (!(locker & BitMask(1)))
{
if (!WriteData(reqHmi1, 0, 0, 1, &reqVal))
{
WriteData(locker, 1, 0, 1, &unlockVal); //对方掉线,强制解锁
}
}
}
return 0;
}
扫描枪
int MacroEntry()
{
char buf[20]="";//清空显示信息用
WriteLocal("LW", 0, 10, (void*)buf, 0);
return 0;
}
范例
数组
int MacroEntry()
{
short i;
for (i=0;i<15;i++) //在15组用户密码中对比
{
LW500[i]=i;
D300[i]=LW500[i];
}
return 0;
}
符号取值范围
#include "macrotypedef.h"
#include "math.h"
int MacroEntry()
{
// 配方名称 12个字符串写入到R20
signed short buf[12] = {0};
signed short buff[27] = {0};
// 读取当前配方名
ReadLocal("RW", 0, 12, (void*)buf, 0);
ReadLocal("PLC", 0, 27, (void*)buff, 0);
switch (LW130)
{
case 1:
// 写入配方1名称到R20
WriteLocal("RW", 20, 12, (void*)buf, 0);
WriteLocal("RW", 50, 27, (void*)buf, 0);
break;
case 2:
// 写入配方2名称到R20
WriteLocal("RW", 100, 12, (void*)buf, 0);
WriteLocal("RW", 150, 27, (void*)buf, 0);
break;
case 3:
// 写入配方3名称到R20
WriteLocal("RW", 200, 12, (void*)buf, 0);
WriteLocal("RW", 250, 27, (void*)buf, 0);
break;
case 4:
// 写入配方4名称到R20
WriteLocal("RW", 300, 12, (void*)buf, 0);
WriteLocal("RW", 350, 27, (void*)buf, 0);
break;
case 5:
// 写入配方5名称到R20
WriteLocal("RW", 400, 12, (void*)buf, 0);
WriteLocal("RW", 450, 27, (void*)buf, 0);
break;
case 6:
// 写入配方5名称到R20
WriteLocal("RW", 500, 12, (void*)buf, 0);
WriteLocal("RW", 550, 27, (void*)buf, 0);
break;
case 7:
// 写入配方7名称到R20
WriteLocal("RW", 600, 12, (void*)buf, 0);
WriteLocal("RW", 650, 27, (void*)buf, 0);
break;
case 8:
// 写入配方8名称到R20
WriteLocal("RW", 700, 12, (void*)buf, 0);
WriteLocal("RW", 750, 27, (void*)buf, 0);
break;
case 9:
// 写入配方5名称到R20
WriteLocal("RW", 800, 12, (void*)buf, 0);
WriteLocal("RW", 850, 27, (void*)buf, 0);
break;
case 10:
// 写入配方10名称到R20
WriteLocal("RW", 900, 12, (void*)buf, 0);
WriteLocal("RW", 950, 27, (void*)buf, 0);
break;
default:
// 其他情况不处理
break;
}
return 0;
}
定时器设置一段时间自动变成0 做成不干预
配方
#include "macrotypedef.h"
#include "math.h"
int MacroEntry()
{
// 定义配方名称缓冲区和参数缓冲区
signed short recipeNameBuf[12] = {0};
signed short recipeParamBuf[27] = {0};
signed short Buf[12] = {0};
signed short Buff[27] = {0};
// 确定当前配方编号
int currentRecipeNumber = LW130;
if (currentRecipeNumber != 0)
// 读取当前配方名称和参数
ReadLocal("RW", 0, 12, (void*)recipeNameBuf, 0);
ReadLocal("PLC", 0, 27, (void*)recipeParamBuf, 0);
{
// 计算配方名称和参数的写入地址
int recipeNameStartAddress = 20 + (currentRecipeNumber - 1) * 100;
int recipeParamStartAddress = 50 + (currentRecipeNumber - 1) * 100;
// 写入配方名称和参数
WriteLocal("RW", recipeNameStartAddress, 12, (void*)recipeNameBuf, 0);
WriteLocal("RW", recipeParamStartAddress, 27, (void*)recipeParamBuf, 0);
}
// 确定当前选择的模型编号
int currentModelNumber = LW132;
// 判断 LW132 是否不等于 0
if (currentModelNumber != 0)
{
// 计算模型名称和参数的读取地址
int modelNameStartAddress = 20 + (currentModelNumber - 1) * 100;
int modelParamStartAddress = 50 + (currentModelNumber - 1) * 100;
// 读取模型名称和参数
ReadLocal("RW", modelNameStartAddress, 12, (void*)Buf, 0);
ReadLocal("RW", modelParamStartAddress, 27, (void*)Buff, 0);
// 写入模型名称和参数
WriteLocal("RW", 0, 12, (void*)Buf, 0);
WriteLocal("PLC", 0, 27, (void*)Buff, 0);
}
return 0;
}
#include "macrotypedef.h"
#include "math.h"
int MacroEntry()
{
// 定义配方名称缓冲区和参数缓冲区
signed short recipeNameBuf[12] = {0};
signed short recipeParamBuf[27] = {0};
signed short Buf[12] = {0};
signed short Buff[27] = {0};
signed short i
// 确定当前配方编号
int currentRecipeNumber = LW130;
if (currentRecipeNumber != 0)
// 读取当前配方名称和参数
ReadLocal("RW", 0, 12, (void*)recipeNameBuf, 0);
ReadLocal("RL", 400, 27, (void*)recipeParamBuf, 0);
{
// 计算配方名称和参数的写入地址
int recipeNameStartAddress = 20 + (currentRecipeNumber - 1) * 100;
int recipeParamStartAddress = 50 + (currentRecipeNumber - 1) * 100;
// 写入配方名称和参数
WriteLocal("RW", recipeNameStartAddress, 12, (void*)recipeNameBuf, 0);
WriteLocal("RW", recipeParamStartAddress, 27, (void*)recipeParamBuf, 0);
}
// 确定当前选择的模型编号
int currentModelNumber = LW132;
// 判断 LW132 是否不等于 0
if (currentModelNumber != 0)
{
// 计算模型名称和参数的读取地址
int modelNameStartAddress = 20 + (currentModelNumber - 1) * 100;
int modelParamStartAddress = 50 + (currentModelNumber - 1) * 100;
// 读取模型名称和参数
ReadLocal("RW", modelNameStartAddress, 12, (void*)Buf, 0);
ReadLocal("RW", modelParamStartAddress, 27, (void*)Buff, 0);
// 写入模型名称和参数
WriteLocal("RW", 0, 12, (void*)Buf, 0);
WriteLocal("RL", 400, 27, (void*)Buff, 0);
}
return 0;
}
#include "macrotypedef.h"
#include "math.h"
int MacroEntry()
{
signed short recipeNameBuf[12] = {0};
signed short Buf[12] = {0};
short i;
// 根据 LW130 的值执行不同的操作
switch (LW130)
{
case 1:
// 在 15 组用户密码中对比
for (i = 0; i < 27; i++)
{
// 将 D400 数组的值复制到 RW10000 数组中
RW10000[i] = D400[i];
}
break;
case 2:
// 在 15 组用户密码中对比
for (i = 0; i < 27; i++)
{
// 将 D400 数组的值复制到 RW10100 数组中
RW10100[i] = D400[i];
}
break;
case 3:
for (i = 0; i < 27; i++)
{
RW10200[i] = D400[i];
}
break;
case 4:
for (i = 0; i < 27; i++)
{
RW10300[i] = D400[i];
}
break;
case 5:
for (i = 0; i < 27; i++)
{
RW10400[i] = D400[i];
}
break;
case 6:
for (i = 0; i < 27; i++)
{
RW10500[i] = D400[i];
}
break;
case 7:
for (i = 0; i < 27; i++)
{
RW10600[i] = D400[i];
}
break;
case 8:
for (i = 0; i < 27; i++)
{
RW10700[i] = D400[i];
}
break;
case 9:
for (i = 0; i < 27; i++)
{
RW10800[i] = D400[i];
}
break;
case 10:
for (i = 0; i < 27; i++)
{
RW10900[i] = D400[i];
}
break;
case 11:
for (i = 0; i < 27; i++)
{
RW11000[i] = D400[i];
}
break;
case 12:
for (i = 0; i < 27; i++)
{
RW11100[i] = D400[i];
}
break;
case 13:
for (i = 0; i < 27; i++)
{
RW11200[i] = D400[i];
}
break;
default:
// 如果 LW130 的值不是 1 或 2,则什么也不做
break;
}
// 根据 LW132 的值执行不同的操作
switch (LW132)
{
case 1:
// 在 15 组用户密码中对比
for (i = 0; i < 27; i++)
{
// 将 D400 数组的值复制到 RW10000 数组中
D400[i]=RW10000[i] ;
}
break;
case 2:
// 在 15 组用户密码中对比
for (i = 0; i < 27; i++)
{
// 将 D400 数组的值复制到 RW10100 数组中
D400[i]=RW10100[i] ;
}
break;
case 3:
for (i = 0; i < 27; i++)
{
D400[i]=RW10200[i] ;
}
break;
case 4:
for (i = 0; i < 27; i++)
{
D400[i]=RW10300[i] ;
}
break;
case 5:
for (i = 0; i < 27; i++)
{
D400[i]=RW10400[i];
}
break;
case 6:
for (i = 0; i < 27; i++)
{
D400[i]=RW10500[i];
}
break;
case 7:
for (i = 0; i < 27; i++)
{
D400[i]=RW10600[i];
}
break;
case 8:
for (i = 0; i < 27; i++)
{
D400[i]=RW10700[i];
}
break;
case 9:
for (i = 0; i < 27; i++)
{
D400[i]=RW10800[i];
}
break;
case 10:
for (i = 0; i < 27; i++)
{
D400[i]=RW10900[i];
}
break;
case 11:
for (i = 0; i < 27; i++)
{
D400[i]=RW11000[i];
}
break;
case 12:
for (i = 0; i < 27; i++)
{
D400[i]=RW11100[i];
}
break;
case 13:
for (i = 0; i < 27; i++)
{
D400[i]=RW11200[i];
}
break;
default:
// 如果 LW132 的值不是 1 或 2,则什么也不做
break;
}
// 确定当前配方编号
int currentRecipeNumber = LW130;
if (currentRecipeNumber != 0)
ReadLocal("RW", 0, 12, (void*)recipeNameBuf, 0);
{
// 计算配方名称和参数的写入地址
int recipeNameStartAddress = 20 + (currentRecipeNumber - 1) * 100;
// 写入配方名称和参数
WriteLocal("RW", recipeNameStartAddress, 12, (void*)recipeNameBuf, 0);
}
// 确定当前选择的模型编号
int currentModelNumber = LW132;
// 判断 LW132 是否不等于 0
if (currentModelNumber != 0)
{
// 计算模型名称和参数的读取地址
int modelNameStartAddress = 20 + (currentModelNumber - 1) * 100;
// 读取模型名称和参数
ReadLocal("RW", modelNameStartAddress, 12, (void*)Buf, 0);
// 写入模型名称和参数
WriteLocal("RW", 0, 12, (void*)Buf, 0);
}
return 0;
}