xiaoxiaocheng_plc/users/ladder.c

4638 lines
165 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************************************/
// CPU需要STM32F103--RAM内存不小于64K Flash内存不小于128K
// 本代码已在STM32F103RDT6、VET6测试通过
// 编辑日期20150909
// editor by 小小晟
// 网店shop182385147.taobao.com
/********************************************************/
#include "stm32f10x.h"
#include <stdio.h>
#include "PLC_IO.h"
#include "PLC_Dialogue.h"
#include "math.h" //数学函数库
#include "Gray.h" //格雷码转换库
#include "PLC_CONF.H"
extern void RST_T_D_C_M_data(void); //ADD 20151214
extern unsigned char Y0P,Y1P; //
extern unsigned short Plus_CMP0,Plus_CMP1; //脉冲标志位
extern u8 X_DIY; //滤波时间
extern u16 PLC_RUN_TIME; //扫描时间
extern void RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec);//时间修改程序
extern void PLC_IO_Refresh(void); //IO刷新输出程序
extern u16 PLC_16BIT[12100]; //PLC_RAM运行寄存器
extern void timer_enable(u16 timer_number); //此处在定时器2里面用于开启定时器处理工
extern void timer_disble(u16 timer_number); //此处在定时器2里面
static u8 PLC_ACC_BIT,PLC_MPS_BIT; //程序执行专用(运算栈及分线栈)
static const u16 *PLC_Addr; //PLC程序指针
static const u16 *PLC_Err; //PLC出错步
static u8 T_number,C_number; //T&C地址缓存寄存器
static u16 T_value; //T比较缓存寄存器
static u16 C_value; //C比较缓存寄存器
static u32 mov_d_addr; //K?M&Y&S&X指令缓存
static const u16 *PLC_P_Addr[129]; //方便调子程序取指针
static const u16 *p_save[129]; //调子程序时保存上一个执行点位
u8 Flag_bit=0xff,Transfer_bit,Transfer_bit1;//其实就是k的标志位 减小函数的量减轻CPU负担
u16 process[64]; //调子程序时保存上一个子程序值
u32 trade; //作用于加减法减小函数的量减轻CPU负担
u16 Transfer=0; //作用多地传递和成批传递 减小函数的量减轻CPU负担
u8 edit_prog; //从新编程缓存寄存器
extern u8 Write_Pro_flag;
const unsigned char PLC_BIT_OR[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
const unsigned char PLC_BIT_AND[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};
float_union FLOAT;
s32_union u32data,u32data1;
u64_union u64data,u64data2;
/***************************************************FOR**************************************************/
struct
{
const u16 *Addr[7]; //FOR 地址记录
u16 cycle[7]; //当前循环的次数
u16 count[7]; //目标循环的次数
u8 point; //for指向的点数
} FOR_CMD;
/***************************************************STL**************************************************/
static u16 PLC_STL_Addr; //STL指令地址号
static u8 PLC_STL_Status; //STL指令当前状态 0整套程序没有STL状态程序1为STL有状态2为STL停止状态
static u8 PLC_STL_CMD; //STL标志
static u8 PLC_STL_Count; //计数线圈数量
static u16 PLC_STL_Coil[256]; //线圈缓存寄存器
/********************************************************************************************************/
static u8 PLC_PL_BIT_TEST(u16 x){return((Step_Address[(x)/8] & PLC_BIT_OR[(x)%8])) ? (1) : (0);}
static u8 PLC_LD_BIT(u16 x){return((PLC_RAM8(RAM_ADDR+((x)/8)) & PLC_BIT_OR[(x)%8])) ? (1) : (0) ;}
static u8 PLC_LDP_TEST(void) //查看是不上升沿
{
if(PLC_PL_BIT_TEST(PLC_Addr-PLC_START_Address)==off)//上升沿判断
{
if(PLC_ACC_BIT&0X01) //当前值判断
{
PLC_PL_BIT_ON(PLC_Addr-PLC_START_Address); //
return 1;
}
else return 0;
}
else
{
if(!(PLC_ACC_BIT&0x01)) //当前值判断
PLC_PL_BIT_OFF(PLC_Addr-PLC_START_Address); //
return 0;
}
}
/*********************************************
函数功能PLC代码错误处理程序
err_id=01:指令出错(未识别指令)
err_id=02:指令出错(暂不支持指令)
err_id=10:数据出错(无法识别数据类型)
err_id=11:数据出错(数据读取地址超出)
err_id=12:数据出错(变址Z地址未知)
err_id=13:数据出错(变址Z地址超出)
err_id=20:CJ指令地址出错
D8061,M8061=PC硬件错误
D8063,M8063=链接,通信错误
D8064,M8064=参数错误
D8065,M8065=语法错误
D8066,M8066=回路错误
D8067,M8067=运算错误
D8068,M8068=运算错误锁存
***********************************************/
void PLC_PROG_ERROR(u16 err,u16 err_id)
{
// PLC_BIT_ON(err); //出错标志 小小晟 屏蔽
D8012=0; //扫描时间
if (D8068==0)D8067=err_id; //语法错误
if (D8068==0)D8068=(PLC_Err-(u16*)(0x800605D)); //保存出错PC步
D8069=D8068;
}
static void LD(u16 start_addr) //起始地址,加元件编号值
{
if(PLC_STL_Status == 1) //为STL状态区 全局步进
{
PLC_ACC_BIT<<=1;
if(PLC_BIT_TEST(start_addr)&&(PLC_BIT_TEST(PLC_STL_Addr)))
PLC_ACC_BIT |=0x01;
}
else
{
PLC_ACC_BIT<<=1;
if(PLC_BIT_TEST(start_addr))
PLC_ACC_BIT |=0x01;
}
}
static void LDI(u16 start_addr)
{
if(PLC_STL_Status == 1) //为STL状态区 全局步进
{
PLC_ACC_BIT<<=1;
if((!(PLC_BIT_TEST(start_addr)))&&(PLC_BIT_TEST(PLC_STL_Addr)))
PLC_ACC_BIT |=0x01;
}
else
{
PLC_ACC_BIT<<=1;
if(PLC_BIT_TEST(start_addr));
else
PLC_ACC_BIT |=0x01;
}
}
void AND(u16 start_addr)
{
if((PLC_BIT_TEST(start_addr))&&(PLC_ACC_BIT&0X01))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0XFE;
}
static void ANI(u16 start_addr)
{
if((!(PLC_BIT_TEST(start_addr)))&&(PLC_ACC_BIT&0X01))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0XFE;
}
static void OR(u16 start_addr)
{
if((PLC_BIT_TEST(start_addr))||(PLC_ACC_BIT&0X01))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0XFE;
}
static void ORI(u16 start_addr)
{
if((!(PLC_BIT_TEST(start_addr)))||(PLC_ACC_BIT&0X01))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0XFE;
}
void OUT(u16 start_addr)
{
if (PLC_STL_CMD == 1) //判断是不是进入步进模式
{
if (PLC_STL_Status == 1) //是不是打开STL模式
{
if(start_addr < 0X000A)//判断开始步进 S000-S009
{
if((PLC_ACC_BIT&0x01)==0x01)
{
PLC_BIT_OFF(PLC_STL_Addr); //OFF
PLC_BIT_ON(start_addr); //ON
}
}
else
{
if(PLC_BIT_TEST(PLC_STL_Addr))
{
if((PLC_ACC_BIT&0x01)==0x01)
{
PLC_BIT_ON(start_addr); //ON
PLC_STL_Coil[PLC_STL_Count++]=start_addr;//记录步进中ON线圈地址 位下个步进成立清除用
}
else
PLC_BIT_OFF(start_addr); //OFF
}
}
}
else
{
if(start_addr < 0X000A)//判断开始步进 S000-S009
{
if(PLC_ACC_BIT & 0x01)
{
PLC_BIT_ON(start_addr); //ON
}
}
else
{
if(PLC_ACC_BIT&0x01)
PLC_BIT_ON(start_addr); //ON
else
PLC_BIT_OFF(start_addr); //OFF
}
}
}
else
{
if(PLC_ACC_BIT&0X01)
PLC_BIT_ON(start_addr); //ON
else
PLC_BIT_OFF(start_addr); //OFF
}
}
static void BIT_SET(u16 start_addr)//位设置
{
u8 temp;
if(PLC_ACC_BIT&0x01)
{
if (PLC_STL_Status == 1) //为STL状态区
{
for(temp=0;temp<=PLC_STL_Count;temp++)
PLC_BIT_OFF(PLC_STL_Coil[temp]); //清除上次ON线圈状态
PLC_BIT_OFF(PLC_STL_Addr); //OFF
PLC_BIT_ON(start_addr); //ON
PLC_STL_Count=0; //清除上次记录ON线圈数量
}
else PLC_BIT_ON(start_addr); //0N
}
}
static void RST(u16 start_addr)//复位位
{
if((PLC_ACC_BIT&0X01)==0X01)
PLC_BIT_OFF(start_addr); //OFF
}
static void RET(void)
{
PLC_STL_Status =0; //退出步进模式 让程序进入梯形图
}
void STL(u16 start_addr) //步进 模式
{
PLC_STL_CMD = 1; //全局程序启用步进标志
PLC_STL_Status = 1; //启动步进模式
PLC_STL_Addr = start_addr; //记录步进地址
PLC_ACC_BIT<<=1;
if(PLC_BIT_TEST(PLC_STL_Addr))
PLC_ACC_BIT |=0x01;
}
// 小小晟20160926优化
static void other_function(u8 process_addr)
{
switch(process_addr)
{
case 0xF8: //块串联 ANB
{
PLC_ACC_BIT = (PLC_ACC_BIT >> 1) & ((PLC_ACC_BIT & 0x01)|0xFE);
break;
}
case 0xF9: //块并联 ORB
{
PLC_ACC_BIT = (PLC_ACC_BIT >> 1) | (PLC_ACC_BIT & 0x01);
break;
}
case 0xFA: //进栈 MPS
{
PLC_MPS_BIT = (PLC_MPS_BIT << 1) | (PLC_ACC_BIT & 0x01);
break;
}
case 0xFB: //读栈 MRD
{
PLC_ACC_BIT = (PLC_ACC_BIT & 0xfe) | (PLC_MPS_BIT & 0x01);
break;
}
case 0xFC: //出栈 MPP
{
PLC_ACC_BIT = (PLC_ACC_BIT & 0xfe) | (PLC_MPS_BIT & 0x01),PLC_MPS_BIT >>= 1;
break;
}
case 0xFD: // 取反 INV
{
PLC_ACC_BIT = (PLC_ACC_BIT & 0xfe) | (~PLC_ACC_BIT & 0x01);
break;
}
case 0xFF: //取反 POP
{
break;
}
default:
{
PLC_PROG_ERROR(M8064,02);
break;
}
}
}
static void LPS(void) //M1536~M3071位LPS指令函数
{
if(PLC_ACC_BIT&0x01)
{
if(PLC_PL_BIT_TEST(PLC_Addr-PLC_START_Address)==0)
{
PLC_PL_BIT_ON(PLC_Addr-PLC_START_Address);
PLC_BIT_ON((0x2fff&*PLC_Addr));
}
else{PLC_BIT_OFF((0x2fff&*PLC_Addr));}
}
else{PLC_PL_BIT_OFF(PLC_Addr-PLC_START_Address);}
PLC_Addr++;
}
static void LPF(void) //M1536~M3071位LPS指令函数
{
if(PLC_ACC_BIT&0x01)
{
if(PLC_PL_BIT_TEST(PLC_Addr-PLC_START_Address)==0)
{PLC_PL_BIT_ON(PLC_Addr-PLC_START_Address);}
}
else
{
if(PLC_PL_BIT_TEST(PLC_Addr-PLC_START_Address))
{
PLC_PL_BIT_OFF(PLC_Addr-PLC_START_Address);
PLC_BIT_ON((0x2fff&*PLC_Addr));
}
else{PLC_BIT_OFF((0x2fff&*PLC_Addr));}
}
PLC_Addr++;
}
static void RESET_T(u8 process_addr) //定时器复位
{
if(PLC_ACC_BIT&0x01) //当前值是否有效
{
PLC_BIT_OFF(0x600+process_addr); //溢出线圈
PLC_BIT_OFF(0x2600+process_addr);//使能线圈
PLC_BIT_ON(0x2300+process_addr); //复位线圈
PLC_16BIT[0x0800+process_addr]=0;//实际计数辶
}
else
PLC_BIT_OFF(0x2300+process_addr); //复位线圈
}
static void RESET_C(u8 process_addr) //定时器复位
{
static u16 *p_data;
if((PLC_ACC_BIT&0x01)==0x01) //当前值是否有效
{
if((process_addr>=0XC8)&&(process_addr<=0XFF))
{
p_data=PLC_16BIT+0x0500+process_addr; //指向值地址
*p_data=0; //清零地址 高位
p_data+=1; //因为是32位
*p_data=0; //清零地址 低位
PLC_BIT_OFF(0x00E0+process_addr); //指向溢出线圈并清溢出线圈
}
else
{
p_data=PLC_16BIT+0x0500+process_addr; //指向值地址
*p_data=0; //清零地址
PLC_BIT_OFF(0x00E0+process_addr); //指向溢出线圈并清溢出线圈
}
}
OUT(0X3700+process_addr);
}
static void RST_T_C(void) //所有T_C位RST指令函数
{
switch(*PLC_Addr/0x100)
{
case 0x86: RESET_T(*PLC_Addr),PLC_Addr++;break;//复位T
case 0x8E: RESET_C(*PLC_Addr),PLC_Addr++;break;//复位C
}
}
static void MOV_TO_K_H(u8 i,u32 data,u8 addr)//进行 MOV ?? K?X&Y&S&M 地址计算
{
u8 LL_BIT; //需要向左移动多少位用寄存器
u16 JOB_ADDR;
int64_t MOV_DATA_64BIT,MOV_DATA_64BIT_BACKUP,MOV_DATA_BACKUP1; //移动32位数据
mov_d_addr|=addr<<8;
mov_d_addr+=Transfer; //成批传递和多点时 Transfer会有数据平时都是0
LL_BIT=mov_d_addr%0x20; //需要移动多少位
JOB_ADDR=(mov_d_addr/0x20)*4; //所在的起始地址
switch(i)
{ // 移动位数 需要的数据做好处理 将数据移动需要的位数 后面要将数据取反用
case 0x82: MOV_DATA_64BIT_BACKUP=data&0X0000000F,MOV_DATA_64BIT_BACKUP<<=LL_BIT,MOV_DATA_BACKUP1=~(0X0000000F<<LL_BIT); break;//传送K1大小
case 0x84: MOV_DATA_64BIT_BACKUP=data&0X000000FF,MOV_DATA_64BIT_BACKUP<<=LL_BIT,MOV_DATA_BACKUP1=~(0X000000FF<<LL_BIT); break;//传送K2大小
case 0x86: MOV_DATA_64BIT_BACKUP=data&0X00000FFF,MOV_DATA_64BIT_BACKUP<<=LL_BIT,MOV_DATA_BACKUP1=~(0X00000FFF<<LL_BIT); break;//传送K3大小
case 0x88: MOV_DATA_64BIT_BACKUP=data&0X0000FFFF,MOV_DATA_64BIT_BACKUP<<=LL_BIT,MOV_DATA_BACKUP1=~(0X0000FFFF<<LL_BIT); break;//传送K4大小
case 0x8A: MOV_DATA_64BIT_BACKUP=data&0X000FFFFF,MOV_DATA_64BIT_BACKUP<<=LL_BIT,MOV_DATA_BACKUP1=~(0X000FFFFF<<LL_BIT); break;//传送K5大小
case 0x8C: MOV_DATA_64BIT_BACKUP=data&0X00FFFFFF,MOV_DATA_64BIT_BACKUP<<=LL_BIT,MOV_DATA_BACKUP1=~(0X00FFFFFF<<LL_BIT); break;//传送K6大小
case 0x8E: MOV_DATA_64BIT_BACKUP=data&0X0FFFFFFF,MOV_DATA_64BIT_BACKUP<<=LL_BIT,MOV_DATA_BACKUP1=~(0X0FFFFFFF<<LL_BIT); break;//传送K7大小
case 0x90: MOV_DATA_64BIT_BACKUP=data&0XFFFFFFFF,MOV_DATA_64BIT_BACKUP<<=LL_BIT,MOV_DATA_BACKUP1=~(0XFFFFFFFF<<LL_BIT); break;//传送K8大小
default: PLC_Addr+=3; break; //遇到不支持的命令
}
MOV_DATA_64BIT=PLC_RAM64(RAM_ADDR+JOB_ADDR);
MOV_DATA_64BIT&=MOV_DATA_BACKUP1; //将需要传送的位置清空
MOV_DATA_64BIT|=MOV_DATA_64BIT_BACKUP; //传入需要到的位置
PLC_RAM64(RAM_ADDR+JOB_ADDR)=MOV_DATA_64BIT; //将数据传到目标位置
}
static signed int MOV_K(u8 Addr) //进行K?X&Y&S&M计算
{
static u16 LL_BIT,JOB_ADDR; //需要向左移动多少位用寄存器
static uint64_t MOV_DATA_64BIT; //移动64位数据
mov_d_addr|=(Addr<<8);
mov_d_addr+=Transfer; //成批传递和多点时 Transfer会有数据平时都是0
LL_BIT=mov_d_addr%0x20; //需要移动多少位
JOB_ADDR=(mov_d_addr/0x20)*4; //所在的起始地址
MOV_DATA_64BIT=PLC_RAM64(RAM_ADDR+JOB_ADDR),
MOV_DATA_64BIT>>=LL_BIT;
return (signed int)MOV_DATA_64BIT;
}
//计算出高位地址
u16 D_C_T_addr(u8 l_value)
{
static u16 temp;
switch(*PLC_Addr/0x100)
{
case 0x80: temp=l_value+((*PLC_Addr%0x100)*0x100),temp=0x0700+temp/2,PLC_Addr++; break;//大于等于D1000
case 0x82: temp=l_value+((*PLC_Addr%0x100)*0x100),temp=0x0800+temp/2,PLC_Addr++; break;//算出T的地址将地址变为值
case 0x84: temp=l_value+((*PLC_Addr%0x100)*0x100),temp=0x0500+temp/2,PLC_Addr++; break;//算出C的地址将地址变为值
case 0x86: temp=l_value+((*PLC_Addr%0x100)*0x100),temp=0x1000+temp/2,PLC_Addr++; break;//算出D的地址将地址变为值
case 0x88: temp=l_value+((*PLC_Addr%0x100)*0x100),temp=0x1000+temp/2+1000,PLC_Addr++; break;//大于等于D1000
}
return temp;
}
//=======================================================================================================
// 函数名称: static u16 addr_value(void)
// 功能描述: 计算PLC地址或k的实数
// 输 入: void
// 输 出: 地址或数据
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月2日
// 备 注:
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 备 注: 优化程序数量测试中部分指令测试 优化后返回地址 k是数据
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
static u16 addr_value(void)
{
static u8 temp;static u16 temp1;
switch(*PLC_Addr/0x100)
{
case 0x84: temp=*PLC_Addr,PLC_Addr++,temp1=*PLC_Addr<<8|temp,PLC_Addr++,Flag_bit=0;break;//进行如 K4M0 之类的传送 break;//进行C的地址
case 0x86: temp=*PLC_Addr,PLC_Addr++;temp1=D_C_T_addr(temp); break;//算出D、C、T的地址
}
return temp1;
}
//=======================================================================================================
// 函数名称: static u32 addr_value_prog(void)
// 功能描述: 计算PLC地址或k的实数
// 输 入: void
// 输 出: 地址或数据
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月23日
// 备 注:
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 备 注:
//=======================================================================================================
static u32 addr_value_prog(void)
{
static u32 temp;
u16 Type_F,temp2,Data1,Data2;
Data1=*PLC_Addr;PLC_Addr++;Data2=*PLC_Addr;
temp2=Type_F=0;
Type_F = (Data1 & 0xff00);
Type_F |= (Data2 >> 8);
temp2 = (Data2 << 8);
temp2 |=mov_d_addr=(u8)Data1;
if(Type_F == 0x8680) temp=RAM_D8000_ADDR+temp2, PLC_Addr++;//算出D的地址 D8000
else if(Type_F == 0x8682) temp=RAM_T_ADDR+temp2, PLC_Addr++;//算出T的地址
else if(Type_F == 0x8684) temp=RAM_C_ADDR+temp2, PLC_Addr++;//算出C的地址
else if(Type_F == 0x8686) temp=RAM_D_ADDR+temp2, PLC_Addr++;//算出D的地址
else if(Type_F == 0x8688) temp=RAM_D1000_ADDR+temp2, PLC_Addr++;//大于等于D1000
else if(Type_F == 0x8482) temp=MOV_K(*PLC_Addr)&0X0000000F,Flag_bit=0,PLC_Addr++;//进行如 K4M0 之类的传送
else if(Type_F == 0x8484) temp=MOV_K(*PLC_Addr)&0X000000FF,Flag_bit=0,PLC_Addr++;//进行如 K4M0 之类的传送
else if(Type_F == 0x8486) temp=MOV_K(*PLC_Addr)&0X00000FFF,Flag_bit=0,PLC_Addr++;//进行如 K4M0 之类的传送
else if(Type_F == 0x8488) temp=MOV_K(*PLC_Addr)&0X0000FFFF,Flag_bit=0,PLC_Addr++;//进行如 K4M0 之类的传送
else if(Type_F == 0x848A) temp=MOV_K(*PLC_Addr)&0X000FFFFF,Flag_bit=0,PLC_Addr++;//进行如 K4M0 之类的传送
else if(Type_F == 0x848C) temp=MOV_K(*PLC_Addr)&0X00FFFFFF,Flag_bit=0,PLC_Addr++;//进行如 K4M0 之类的传送
else if(Type_F == 0x848E) temp=MOV_K(*PLC_Addr)&0X0FFFFFFF,Flag_bit=0,PLC_Addr++;//进行如 K4M0 之类的传送
else if(Type_F == 0x8490) temp=MOV_K(*PLC_Addr), Flag_bit=0,PLC_Addr++;//进行如 K4M0 之类的传送
return temp;
}
unsigned short V0_V3(u16 temp1)
{
u8 temp=PLC_v_z_addr(temp1);
if(temp==0) return D8029;
else if(temp==1) return D8183;
else if(temp==2) return D8185;
else if(temp==3) return D8187;
else return 0;
}
unsigned short V4_V7(u16 temp1)
{
u8 temp=PLC_v_z_addr(temp1);
if(temp==0) return D8189;
else if(temp==1) return D8191;
else if(temp==2) return D8193;
else if(temp==3) return D8195;
else return 0;
}
unsigned short Z0_Z3(u16 temp1)
{
u8 temp=PLC_v_z_addr(temp1);
if(temp==0) return D8028;
else if(temp==1) return D8182;
else if(temp==2) return D8184;
else if(temp==3) return D8186;
else return 0;
}
unsigned short Z4_Z7(u16 temp1)
{
u8 temp=PLC_v_z_addr(temp1);
if(temp==0) return D8188;
else if(temp==1) return D8190;
else if(temp==2) return D8192;
else if(temp==3) return D8194;
else return 0;
}
unsigned int DZ0_Z3(u16 temp1)
{
u8 temp=PLC_v_z_addr(temp1);
if(temp==0) return D8028+D8029*0X10000;
else if(temp==1) return D8182+D8183*0X10000;
else if(temp==2) return D8184+D8184*0X10000;
else if(temp==3) return D8186+D8185*0X10000;
else return 0;
}
unsigned short DZ4_Z7(u16 temp1)
{
u8 temp=PLC_v_z_addr(temp1);
if(temp==0) return D8188+D8189*0X10000;
else if(temp==1) return D8190+D8191*0X10000;
else if(temp==2) return D8192+D8193*0X10000;
else if(temp==3) return D8194+D8193*0X10000;
else return 0;
}
//=======================================================================================================
// 函数名称: static void target(void)
// 功能描述: 加减法“与”“或”“异或”共用赋值函数 如DMOV、DADD、DSUB等指令的结果传递出去
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月23日
// 备 注:
//=======================================================================================================
static void D_target(void)
{
u16 Type_F,temp2,Data1,Data2;
Data1=*PLC_Addr;PLC_Addr++;Data2=*PLC_Addr;
temp2=Type_F=0;
Type_F = (Data1 & 0xff00);
Type_F |= (Data2 >> 8);
/************************************/
temp2 = (Data2 << 8);
temp2 |=mov_d_addr=(u8)Data1;
/************************************/
switch(Type_F)
{
case 0x8482: MOV_TO_K_H(Type_F,trade,*PLC_Addr),PLC_Addr++,Transfer_bit=1;break; //进行如 K4M0 之类的传送
case 0x8484: MOV_TO_K_H(Type_F,trade,*PLC_Addr),PLC_Addr++,Transfer_bit=1;break; //进行如 K4M0 之类的传送
case 0x8486: MOV_TO_K_H(Type_F,trade,*PLC_Addr),PLC_Addr++,Transfer_bit=1;break; //进行如 K4M0 之类的传送
case 0x8488: MOV_TO_K_H(Type_F,trade,*PLC_Addr),PLC_Addr++,Transfer_bit=1;break; //进行如 K4M0 之类的传送
case 0x848A: MOV_TO_K_H(Type_F,trade,*PLC_Addr),PLC_Addr++,Transfer_bit=1;break; //进行如 K4M0 之类的传送
case 0x848C: MOV_TO_K_H(Type_F,trade,*PLC_Addr),PLC_Addr++,Transfer_bit=1;break; //进行如 K4M0 之类的传送
case 0x848E: MOV_TO_K_H(Type_F,trade,*PLC_Addr),PLC_Addr++,Transfer_bit=1;break; //进行如 K4M0 之类的传送
case 0x8490: MOV_TO_K_H(Type_F,trade,*PLC_Addr),PLC_Addr++,Transfer_bit=1;break; //进行如 K4M0 之类的传送
case 0x8680: PLC_RAM32(RAM_D8000_ADDR+temp2+Transfer)=trade,PLC_Addr++;break; //算出D的地址 D8000
case 0x8682: PLC_RAM32(RAM_T_ADDR+temp2+Transfer)=trade,PLC_Addr++;break; //算出T的地址
case 0x8684: PLC_RAM32(RAM_C_ADDR+temp2+Transfer)=trade,PLC_Addr++;break; //算出C的地址
case 0x8686: PLC_RAM32(RAM_D_ADDR+temp2+Transfer)=trade,PLC_Addr++;break; //算出D的地址
case 0x8688: PLC_RAM32(RAM_D1000_ADDR+temp2+Transfer)=trade,PLC_Addr++;break; //大于等于D1000
/************************************************K1M0寄存器"Z"*******************************************************************/
case 0xA482: mov_d_addr=+DZ0_Z3(temp2),MOV_TO_K_H(Type_F,trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K1M0的V0-V3
case 0xA483: mov_d_addr=+DZ4_Z7(temp2),MOV_TO_K_H(Type_F,trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K1M0的V4-V7
/************************************************K2M0寄存器"Z"*******************************************************************/
case 0xA484: mov_d_addr=+DZ0_Z3(temp2),MOV_TO_K_H(Type_F,trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K2M0的V0-V3
case 0xA485: mov_d_addr=+DZ4_Z7(temp2),MOV_TO_K_H(Type_F,trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K2M0的V4-V7
/************************************************K3M0寄存器"Z"*******************************************************************/
case 0xA486: mov_d_addr=+DZ0_Z3(temp2),MOV_TO_K_H(Type_F,trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K3M0的V0-V3
case 0xA487: mov_d_addr=+DZ4_Z7(temp2),MOV_TO_K_H(Type_F,trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K3M0的V4-V7
/************************************************K4M0寄存器"Z"*******************************************************************/
case 0xA488: mov_d_addr=+DZ0_Z3(temp2),MOV_TO_K_H(Type_F,trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K4M0的V0-V3
case 0xA489: mov_d_addr=+DZ4_Z7(temp2),MOV_TO_K_H(Type_F,trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K4M0的V4-V7
/************************************************K5M0寄存器"Z"*******************************************************************/
case 0xA48A: mov_d_addr=+DZ0_Z3(temp2),MOV_TO_K_H(Type_F,trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K5M0的V0-V3
case 0xA48B: mov_d_addr=+DZ4_Z7(temp2),MOV_TO_K_H(Type_F,trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K5M0的V4-V7
/************************************************K6M0寄存器"Z"*******************************************************************/
case 0xA48C: mov_d_addr=+DZ0_Z3(temp2),MOV_TO_K_H(Type_F,trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K6M0的V0-V3
case 0xA48D: mov_d_addr=+DZ4_Z7(temp2),MOV_TO_K_H(Type_F,trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K6M0的V4-V7
/************************************************K7M0寄存器"Z"*******************************************************************/
case 0xA48E: mov_d_addr=+DZ0_Z3(temp2),MOV_TO_K_H(Type_F,trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K7M0的V0-V3
case 0xA48F: mov_d_addr=+DZ4_Z7(temp2),MOV_TO_K_H(Type_F,trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K7M0的V4-V7
/************************************************K8M0寄存器"Z"*******************************************************************/
case 0xA490: mov_d_addr=+DZ0_Z3(temp2),MOV_TO_K_H(Type_F,trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//k8M0的V0-V4
case 0xA491: mov_d_addr=+DZ4_Z7(temp2),MOV_TO_K_H(Type_F,trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K8M0的V4-V7
/************************************************T寄存器"Z"*******************************************************************/
case 0xA682: PLC_RAM32(RAM_T_ADDR+PLC_D_C_T_addr(temp2)+DZ0_Z3(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出T的地址的Z0-Z3
case 0xA683: PLC_RAM32(RAM_T_ADDR+PLC_D_C_T_addr(temp2)+DZ4_Z7(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出T的地址的Z4-Z7
/************************************************C寄存器"Z"*******************************************************************/
case 0xA684: PLC_RAM32(RAM_C_ADDR+PLC_D_C_T_addr(temp2)+DZ0_Z3(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出C的地址的Z0-Z3
case 0xA685: PLC_RAM32(RAM_C_ADDR+PLC_D_C_T_addr(temp2)+DZ4_Z7(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出C的地址的Z4-Z7
/************************************************D寄存器"Z"*******************************************************************/
case 0xA686: PLC_RAM32(RAM_D_ADDR+PLC_D_C_T_addr(temp2)+DZ0_Z3(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出D的地址的Z0-Z3
case 0xA687: PLC_RAM32(RAM_D_ADDR+PLC_D_C_T_addr(temp2)+DZ4_Z7(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出D的地址的Z4-Z7
case 0xA688: PLC_RAM32(RAM_D1000_ADDR+PLC_D_C_T_addr(temp2)+DZ0_Z3(temp2)*2)=(u16)trade,PLC_Addr++;break;//大于等于D1000的Z0-Z3
case 0xA689: PLC_RAM32(RAM_D1000_ADDR+PLC_D_C_T_addr(temp2)+DZ4_Z7(temp2)*2)=(u16)trade,PLC_Addr++;break;//大于等于D1000的Z4-Z7
}
PLC_Addr+=2;
}
//=======================================================================================================
// 函数名称: static void target(void)
// 功能描述: 加减法“与”“或”“异或”共用赋值函数 如MOV、ADD、SUB等指令的结果传递出去
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月23日
// 备 注:
//=======================================================================================================
static void target(void)
{
u16 Type_F,temp2,Data1,Data2;
Data1=*PLC_Addr;PLC_Addr++;Data2=*PLC_Addr;
temp2=Type_F=0;
Type_F = (Data1 & 0xff00);
Type_F |= (Data2 >> 8);
/************************************/
temp2 = (Data2 << 8);
temp2 |=mov_d_addr=(u8)Data1;
/************************************/
switch(Type_F)
{
case 0x8482: MOV_TO_K_H(Type_F,(u16)trade,*PLC_Addr),PLC_Addr++,Transfer_bit=1;break; //进行如 K4M0 之类的传送
case 0x8484: MOV_TO_K_H(Type_F,(u16)trade,*PLC_Addr),PLC_Addr++,Transfer_bit=1;break; //进行如 K4M0 之类的传送
case 0x8486: MOV_TO_K_H(Type_F,(u16)trade,*PLC_Addr),PLC_Addr++,Transfer_bit=1;break; //进行如 K4M0 之类的传送
case 0x8488: MOV_TO_K_H(Type_F,(u16)trade,*PLC_Addr),PLC_Addr++,Transfer_bit=1;break; //进行如 K4M0 之类的传送
case 0x8680: PLC_RAM16(RAM_D8000_ADDR+temp2+Transfer)=(u16)trade,PLC_Addr++;break; //算出D的地址 D8000
case 0x8682: PLC_RAM16(RAM_T_ADDR+temp2+Transfer)=(u16)trade,PLC_Addr++;break; //算出T的地址
case 0x8684: PLC_RAM16(RAM_C_ADDR+temp2+Transfer)=(u16)trade,PLC_Addr++;break; //算出C的地址
case 0x8686: PLC_RAM16(RAM_D_ADDR+temp2+Transfer)=(u16)trade,PLC_Addr++;break; //算出D的地址
case 0x8688: PLC_RAM16(RAM_D1000_ADDR+temp2+Transfer)=(u16)trade,PLC_Addr++;break; //大于等于D1000
/************************************************K1M0寄存器"V"*******************************************************************/
case 0x9482: mov_d_addr=+V0_V3(temp2),MOV_TO_K_H(Type_F,(u16)trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K1M0的V0-V3
case 0x9483: mov_d_addr=+V4_V7(temp2),MOV_TO_K_H(Type_F,(u16)trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K1M0的V4-V7
/************************************************K2M0寄存器"V"*******************************************************************/
case 0x9484: mov_d_addr=+V0_V3(temp2),MOV_TO_K_H(Type_F,(u16)trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K2M0的V0-V3
case 0x9485: mov_d_addr=+V4_V7(temp2),MOV_TO_K_H(Type_F,(u16)trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K2M0的V4-V7
/************************************************K3M0寄存器"V"*******************************************************************/
case 0x9486: mov_d_addr=+V0_V3(temp2),MOV_TO_K_H(Type_F,(u16)trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K3M0的V0-V3
case 0x9487: mov_d_addr=+V4_V7(temp2),MOV_TO_K_H(Type_F,(u16)trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K3M0的V4-V7
/************************************************K4M0寄存器"V"*******************************************************************/
case 0x9488: mov_d_addr=+V0_V3(temp2),MOV_TO_K_H(Type_F,(u16)trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K4M0的V0-V3
case 0x9489: mov_d_addr=+V4_V7(temp2),MOV_TO_K_H(Type_F,(u16)trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K4M0的V4-V7
/************************************************T寄存器"V"*******************************************************************/
case 0x9682: PLC_RAM16(RAM_T_ADDR+PLC_D_C_T_addr(temp2)+V0_V3(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出T的地址的V0-V3
case 0x9683: PLC_RAM16(RAM_T_ADDR+PLC_D_C_T_addr(temp2)+V4_V7(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出T的地址的V4-V7
/************************************************C寄存器"V"*******************************************************************/
case 0x9684: PLC_RAM16(RAM_C_ADDR+PLC_D_C_T_addr(temp2)+V0_V3(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出C的地址的V0-V3
case 0x9685: PLC_RAM16(RAM_C_ADDR+PLC_D_C_T_addr(temp2)+V4_V7(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出C的地址的V4-V7
/************************************************D寄存器"V"*******************************************************************/
case 0x9686: PLC_RAM16(RAM_D_ADDR+PLC_D_C_T_addr(temp2)+V0_V3(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出D的地址的V0-V3
case 0x9687: PLC_RAM16(RAM_D_ADDR+PLC_D_C_T_addr(temp2)+V4_V7(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出D的地址的V4-V7
case 0x9688: PLC_RAM16(RAM_D1000_ADDR+PLC_D_C_T_addr(temp2)+V0_V3(temp2)*2)=(u16)trade,PLC_Addr++;break;//大于等于D1000的V0-V3
case 0x9689: PLC_RAM16(RAM_D1000_ADDR+PLC_D_C_T_addr(temp2)+V4_V7(temp2)*2)=(u16)trade,PLC_Addr++;break;//大于等于D1000的V4-V7
/************************************************K1M0寄存器"Z"*******************************************************************/
case 0xA482: mov_d_addr=+Z0_Z3(temp2),MOV_TO_K_H(Type_F,(u16)trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K1M0的V0-V3
case 0xA483: mov_d_addr=+Z4_Z7(temp2),MOV_TO_K_H(Type_F,(u16)trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K1M0的V4-V7
/************************************************K2M0寄存器"Z"*******************************************************************/
case 0xA484: mov_d_addr=+Z0_Z3(temp2),MOV_TO_K_H(Type_F,(u16)trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K2M0的V0-V3
case 0xA485: mov_d_addr=+Z4_Z7(temp2),MOV_TO_K_H(Type_F,(u16)trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K2M0的V4-V7
/************************************************K3M0寄存器"Z"*******************************************************************/
case 0xA486: mov_d_addr=+Z0_Z3(temp2),MOV_TO_K_H(Type_F,(u16)trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K3M0的V0-V3
case 0xA487: mov_d_addr=+Z4_Z7(temp2),MOV_TO_K_H(Type_F,(u16)trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K3M0的V4-V7
/************************************************K4M0寄存器"Z"*******************************************************************/
case 0xA488: mov_d_addr=+Z0_Z3(temp2),MOV_TO_K_H(Type_F,(u16)trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K4M0的V0-V3
case 0xA489: mov_d_addr=+Z4_Z7(temp2),MOV_TO_K_H(Type_F,(u16)trade,PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K4M0的V4-V7
/************************************************T寄存器"Z"*******************************************************************/
case 0xA682: PLC_RAM16(RAM_T_ADDR+PLC_D_C_T_addr(temp2)+Z0_Z3(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出C的地址的Z0-Z3
case 0xA683: PLC_RAM16(RAM_T_ADDR+PLC_D_C_T_addr(temp2)+Z4_Z7(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出C的地址的Z4-Z7
/************************************************C寄存器"Z"*******************************************************************/
case 0xA684: PLC_RAM16(RAM_C_ADDR+PLC_D_C_T_addr(temp2)+Z0_Z3(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出C的地址的Z0-Z3
case 0xA685: PLC_RAM16(RAM_C_ADDR+PLC_D_C_T_addr(temp2)+Z4_Z7(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出C的地址的Z4-Z7
/************************************************D寄存器"Z"*******************************************************************/
case 0xA686: PLC_RAM16(RAM_D_ADDR+PLC_D_C_T_addr(temp2)+Z0_Z3(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出D的地址的Z0-Z3
case 0xA687: PLC_RAM16(RAM_D_ADDR+PLC_D_C_T_addr(temp2)+Z4_Z7(temp2)*2)=(u16)trade,PLC_Addr++;break;//算出D的地址的Z4-Z7
case 0xA688: PLC_RAM16(RAM_D1000_ADDR+PLC_D_C_T_addr(temp2)+Z0_Z3(temp2)*2)=(u16)trade,PLC_Addr++;break;//大于等于D1000的Z0-Z3
case 0xA689: PLC_RAM16(RAM_D1000_ADDR+PLC_D_C_T_addr(temp2)+Z4_Z7(temp2)*2)=(u16)trade,PLC_Addr++;break;//大于等于D1000的Z4-Z7
}
}
//=======================================================================================================
// 函数名称: static u16 cos_value(void)
// 功能描述:
// 输 入: void
// 输 出: 输出16位数据
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月19日
// 备 注:
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 备 注:
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
static s16 cos_value()
{
static s16 temp;
u16 Type_F,temp2,Data1,Data2;
Data1=*PLC_Addr;PLC_Addr++;Data2=*PLC_Addr;
temp2=Type_F=0;
Type_F = (Data1 & 0xff00);
Type_F |= (Data2 >> 8);
/************************************/
temp2 = (Data2 << 8);
temp2 |=mov_d_addr=(u8)Data1;
/************************************/
switch(Type_F)
{
case 0x8080: temp=temp2, PLC_Addr++;break; //算出K值
case 0x8280: temp=temp2, PLC_Addr++;break; //算出H值
case 0x8482: temp=MOV_K(*PLC_Addr)&0X0000000F,Transfer_bit1=1,PLC_Addr++;break; //进行如 K4M0 之类的传送
case 0x8484: temp=MOV_K(*PLC_Addr)&0X000000FF,Transfer_bit1=1,PLC_Addr++;break; //进行如 K4M0 之类的传送
case 0x8486: temp=MOV_K(*PLC_Addr)&0X00000FFF,Transfer_bit1=1,PLC_Addr++;break; //进行如 K4M0 之类的传送
case 0x8488: temp=MOV_K(*PLC_Addr)&0X0000FFFF,Transfer_bit1=1,PLC_Addr++;break; //进行如 K4M0 之类的传送
case 0x8680: temp=PLC_RAM16(RAM_D8000_ADDR+temp2+Transfer),PLC_Addr++;break; //算出D的地址 D8000
case 0x8682: temp=PLC_RAM16(RAM_D_ADDR+temp2+Transfer),PLC_Addr++;break; //算出T的地址
case 0x8684: temp=PLC_RAM16(RAM_C_ADDR+temp2+Transfer),PLC_Addr++;break; //算出C的地址
case 0x8686: temp=PLC_RAM16(RAM_D_ADDR+temp2+Transfer),PLC_Addr++;break; //算出D的地址
case 0x8688: temp=PLC_RAM16(RAM_D1000_ADDR+temp2+Transfer),PLC_Addr++;break; //大于等于D1000
/************************************************K寄存器"V"*******************************************************************/
case 0x9080: temp=temp2+D8029,PLC_Addr++;break;//算出K的地址的V0
case 0x9081: temp=temp2+D8183,PLC_Addr++;break;//算出K的地址的V1
case 0x9082: temp=temp2+D8185,PLC_Addr++;break;//算出K的地址的V2
case 0x9083: temp=temp2+D8187,PLC_Addr++;break;//算出K的地址的V3
case 0x9084: temp=temp2+D8189,PLC_Addr++;break;//算出K的地址的V4
case 0x9085: temp=temp2+D8191,PLC_Addr++;break;//算出K的地址的V5
case 0x9086: temp=temp2+D8193,PLC_Addr++;break;//算出K的地址的V6
case 0x9087: temp=temp2+D8195,PLC_Addr++;break;//算出K的地址的V7
case 0x9280: temp=temp2+D8029,PLC_Addr++;break;//算出H的地址的V0
case 0x9281: temp=temp2+D8183,PLC_Addr++;break;//算出H的地址的V1
case 0x9282: temp=temp2+D8185,PLC_Addr++;break;//算出H的地址的V2
case 0x9283: temp=temp2+D8187,PLC_Addr++;break;//算出H的地址的V3
case 0x9284: temp=temp2+D8189,PLC_Addr++;break;//算出H的地址的V4
case 0x9285: temp=temp2+D8191,PLC_Addr++;break;//算出H的地址的V5
case 0x9286: temp=temp2+D8193,PLC_Addr++;break;//算出H的地址的V6
case 0x9287: temp=temp2+D8195,PLC_Addr++;break;//算出H的地址的V7
/************************************************K1M0寄存器"V"*******************************************************************/
case 0x9482: mov_d_addr=+V0_V3(temp2),temp=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X0000000F,PLC_Addr++;break;//K1M0的V0-V3
case 0x9483: mov_d_addr=+V4_V7(temp2),temp=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X0000000F,PLC_Addr++;break;//K1M0的V4-V7
/************************************************K2M0寄存器"V"*******************************************************************/
case 0x9484: mov_d_addr=+V0_V3(temp2),temp=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X000000FF,PLC_Addr++;break;//K2M0的V0-V3
case 0x9485: mov_d_addr=+V4_V7(temp2),temp=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X000000FF,PLC_Addr++;break;//K2M0的V4-V7
/************************************************K3M0寄存器"V"*******************************************************************/
case 0x9486: mov_d_addr=+V0_V3(temp2),temp=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X00000FFF,PLC_Addr++;break;//K3M0的V0-V3
case 0x9487: mov_d_addr=+V4_V7(temp2),temp=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X00000FFF,PLC_Addr++;break;//K3M0的V4-V7
/************************************************K4M0寄存器"V"*******************************************************************/
case 0x9488: mov_d_addr=+V0_V3(temp2),temp=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X0000FFFF,PLC_Addr++;break;//K4M0的V0-V3
case 0x9489: mov_d_addr=+V4_V7(temp2),temp=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X0000FFFF,PLC_Addr++;break;//K4M0的V4-V7
/************************************************T寄存器"V"*******************************************************************/
case 0x9682: temp=PLC_RAM16(RAM_T_ADDR+PLC_D_C_T_addr(temp2)+V0_V3(temp2)*2),PLC_Addr++;break;//算出T的地址的V0-V3
case 0x9683: temp=PLC_RAM16(RAM_T_ADDR+PLC_D_C_T_addr(temp2)+V4_V7(temp2)*2),PLC_Addr++;break;//算出T的地址的V4-V7
/************************************************C寄存器"V"*******************************************************************/
case 0x9684: temp=PLC_RAM16(RAM_C_ADDR+PLC_D_C_T_addr(temp2)+V0_V3(temp2)*2),PLC_Addr++;break;//算出C的地址的V0-V3
case 0x9685: temp=PLC_RAM16(RAM_C_ADDR+PLC_D_C_T_addr(temp2)+V4_V7(temp2)*2),PLC_Addr++;break;//算出C的地址的V4-V7
/************************************************D寄存器"V"*******************************************************************/
case 0x9686: temp=PLC_RAM16(RAM_D_ADDR+PLC_D_C_T_addr(temp2)+V0_V3(temp2)*2),PLC_Addr++;break;//算出D的地址的V0-V3
case 0x9687: temp=PLC_RAM16(RAM_D_ADDR+PLC_D_C_T_addr(temp2)+V4_V7(temp2)*2),PLC_Addr++;break;//算出D的地址的V4-V7
case 0x9688: temp=PLC_RAM16(RAM_D1000_ADDR+PLC_D_C_T_addr(temp2)+V0_V3(temp2)*2),PLC_Addr++;break;//大于等于D1000的V0-V3
case 0x9689: temp=PLC_RAM16(RAM_D1000_ADDR+PLC_D_C_T_addr(temp2)+V4_V7(temp2)*2),PLC_Addr++;break;//大于等于D1000的V4-V7
case 0xA080: temp=temp2+D8028,PLC_Addr++;break;//算出K的地址的Z0
case 0xA081: temp=temp2+D8182,PLC_Addr++;break;//算出K的地址的Z1
case 0xA082: temp=temp2+D8184,PLC_Addr++;break;//算出K的地址的Z2
case 0xA083: temp=temp2+D8186,PLC_Addr++;break;//算出K的地址的Z3
case 0xA084: temp=temp2+D8188,PLC_Addr++;break;//算出K的地址的Z4
case 0xA085: temp=temp2+D8190,PLC_Addr++;break;//算出K的地址的Z5
case 0xA086: temp=temp2+D8192,PLC_Addr++;break;//算出K的地址的Z6
case 0xA087: temp=temp2+D8194,PLC_Addr++;break;//算出K的地址的Z7
case 0xA280: temp=temp2+D8028,PLC_Addr++;break;//算出H的地址的Z0
case 0xA281: temp=temp2+D8182,PLC_Addr++;break;//算出H的地址的Z1
case 0xA282: temp=temp2+D8184,PLC_Addr++;break;//算出H的地址的Z2
case 0xA283: temp=temp2+D8186,PLC_Addr++;break;//算出H的地址的Z3
case 0xA284: temp=temp2+D8188,PLC_Addr++;break;//算出H的地址的Z4
case 0xA285: temp=temp2+D8190,PLC_Addr++;break;//算出H的地址的Z5
case 0xA286: temp=temp2+D8192,PLC_Addr++;break;//算出H的地址的Z6
case 0xA287: temp=temp2+D8194,PLC_Addr++;break;//算出H的地址的Z7
/************************************************K1M0寄存器"Z"*******************************************************************/
case 0xA482: mov_d_addr=+Z0_Z3(temp2),temp=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X0000000F,PLC_Addr++;break;//K1M0的V0-V3
case 0xA483: mov_d_addr=+Z4_Z7(temp2),temp=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X0000000F,PLC_Addr++;break;//K1M0的V4-V7
/************************************************K2M0寄存器"Z"*******************************************************************/
case 0xA484: mov_d_addr=+Z0_Z3(temp2),temp=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X000000FF,PLC_Addr++;break;//K2M0的V0-V3
case 0xA485: mov_d_addr=+Z4_Z7(temp2),temp=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X000000FF,PLC_Addr++;break;//K2M0的V4-V7
/************************************************K3M0寄存器"Z"*******************************************************************/
case 0xA486: mov_d_addr=+Z0_Z3(temp2),temp=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X00000FFF,PLC_Addr++;break;//K3M0的V0-V3
case 0xA487: mov_d_addr=+Z4_Z7(temp2),temp=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X00000FFF,PLC_Addr++;break;//K3M0的V4-V7
/************************************************K4M0寄存器"Z"*******************************************************************/
case 0xA488: mov_d_addr=+Z0_Z3(temp2),temp=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X0000FFFF,PLC_Addr++;break;//K4M0的V0-V3
case 0xA489: mov_d_addr=+Z4_Z7(temp2),temp=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X0000FFFF,PLC_Addr++;break;//K4M0的V4-V7
case 0xA682: temp=PLC_RAM16(RAM_T_ADDR+PLC_D_C_T_addr(temp2)+Z0_Z3(temp2)*2),PLC_Addr++;break;//算出T的地址的Z0-Z3
case 0xA683: temp=PLC_RAM16(RAM_T_ADDR+PLC_D_C_T_addr(temp2)+Z4_Z7(temp2)*2),PLC_Addr++;break;//算出T的地址的Z4-Z7
/************************************************C寄存器"Z"*******************************************************************/
case 0xA684: temp=PLC_RAM16(RAM_C_ADDR+PLC_D_C_T_addr(temp2)+Z0_Z3(temp2)*2),PLC_Addr++;break;//算出C的地址的Z0-Z3
case 0xA685: temp=PLC_RAM16(RAM_C_ADDR+PLC_D_C_T_addr(temp2)+Z4_Z7(temp2)*2),PLC_Addr++;break;//算出C的地址的Z4-Z7
/************************************************D寄存器"Z"*******************************************************************/
case 0xA686: temp=PLC_RAM16(RAM_D_ADDR+PLC_D_C_T_addr(temp2)+Z0_Z3(temp2)*2),PLC_Addr++;break;//算出D的地址的Z0-Z3
case 0xA687: temp=PLC_RAM16(RAM_D_ADDR+PLC_D_C_T_addr(temp2)+Z4_Z7(temp2)*2),PLC_Addr++;break;//算出D的地址的Z4-Z7
case 0xA688: temp=PLC_RAM16(RAM_D1000_ADDR+PLC_D_C_T_addr(temp2)+Z0_Z3(temp2)*2),PLC_Addr++;break;//大于等于D1000的Z0-Z3
case 0xA689: temp=PLC_RAM16(RAM_D1000_ADDR+PLC_D_C_T_addr(temp2)+Z4_Z7(temp2)*2),PLC_Addr++;break;//大于等于D1000的Z4-Z7
}
return temp;
}
//=======================================================================================================
// 函数名称: static u32 cos_u32_value(void)
// 功能描述:
// 输 入: void
// 输 出: 输出32位数据
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月19日
// 备 注:
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 备 注:
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
#define D_data u32data.data
static s32 cos_u32_value(void)
{
u16 Type_F,temp2,Data1,Data2;
unsigned short temp;
Data1=*PLC_Addr;
PLC_Addr++;
Data2=*PLC_Addr;
temp2=Type_F=0;
Type_F = (Data1 & 0xff00);
Type_F |= (Data2 >> 8);
/************************************/
temp2 = (Data2 << 8);
temp2 |=mov_d_addr=(u8)Data1;
/************************************/
switch(Type_F)
{
case 0x8080: u32data.data1[0]=temp2,PLC_Addr++,u32data.data1[1]=cos_value(),PLC_Addr-=2;break;//算出K值
case 0x8280: u32data.data1[0]=temp2,PLC_Addr++,u32data.data1[1]=cos_value(),PLC_Addr-=2;break;//算出H值
case 0x8482: D_data=MOV_K(*PLC_Addr)&0X0000000F,Transfer_bit1=1,PLC_Addr++;break;//进行如 K4M0 之类的传送
case 0x8484: D_data=MOV_K(*PLC_Addr)&0X000000FF,Transfer_bit1=1,PLC_Addr++;break;//进行如 K4M0 之类的传送
case 0x8486: D_data=MOV_K(*PLC_Addr)&0X00000FFF,Transfer_bit1=1,PLC_Addr++;break;//进行如 K4M0 之类的传送
case 0x8488: D_data=MOV_K(*PLC_Addr)&0X0000FFFF,Transfer_bit1=1,PLC_Addr++;break;//进行如 K4M0 之类的传送
case 0x848A: D_data=MOV_K(*PLC_Addr)&0X000FFFFF,Transfer_bit1=1,PLC_Addr++;break;//进行如 K4M0 之类的传送
case 0x848C: D_data=MOV_K(*PLC_Addr)&0X00FFFFFF,Transfer_bit1=1,PLC_Addr++;break;//进行如 K4M0 之类的传送
case 0x848E: D_data=MOV_K(*PLC_Addr)&0X0FFFFFFF,Transfer_bit1=1,PLC_Addr++;break;//进行如 K4M0 之类的传送
case 0x8490: D_data=MOV_K(*PLC_Addr), Transfer_bit1=1,PLC_Addr++;break;//进行如 K4M0 之类的传送
case 0x8680: D_data=PLC_RAM32(RAM_D8000_ADDR+temp2),PLC_Addr++;break; //算出D的地址 D8000
case 0x8682: D_data=PLC_RAM32(RAM_T_ADDR+temp2),PLC_Addr++;break; //算出T的地址
case 0x8684: D_data=PLC_RAM32(RAM_C_ADDR+temp2),PLC_Addr++;break; //算出C的地址
case 0x8686: D_data=PLC_RAM32(RAM_D_ADDR+temp2),PLC_Addr++;break; //算出D的地址
case 0x8688: D_data=PLC_RAM32(RAM_D1000_ADDR+temp2),PLC_Addr++;break; //大于等于D1000
case 0xA080: u32data.data1[0]=temp2+D8028,PLC_Addr++,u32data.data1[1]=cos_value()+D8029,PLC_Addr-=2;break;//算出K的地址的Z0
case 0xA081: u32data.data1[0]=temp2+D8182,PLC_Addr++,u32data.data1[1]=cos_value()+D8183,PLC_Addr-=2;break;//算出K的地址的Z1
case 0xA082: u32data.data1[0]=temp2+D8184,PLC_Addr++,u32data.data1[1]=cos_value()+D8185,PLC_Addr-=2;break;//算出K的地址的Z2
case 0xA083: u32data.data1[0]=temp2+D8186,PLC_Addr++,u32data.data1[1]=cos_value()+D8187,PLC_Addr-=2;break;//算出K的地址的Z3
case 0xA084: u32data.data1[0]=temp2+D8188,PLC_Addr++,u32data.data1[1]=cos_value()+D8189,PLC_Addr-=2;break;//算出K的地址的Z4
case 0xA085: u32data.data1[0]=temp2+D8190,PLC_Addr++,u32data.data1[1]=cos_value()+D8191,PLC_Addr-=2;break;//算出K的地址的Z5
case 0xA086: u32data.data1[0]=temp2+D8192,PLC_Addr++,u32data.data1[1]=cos_value()+D8193,PLC_Addr-=2;break;//算出K的地址的Z6
case 0xA087: u32data.data1[0]=temp2+D8194,PLC_Addr++,u32data.data1[1]=cos_value()+D8195,PLC_Addr-=2;break;//算出K的地址的Z7
case 0xA280: u32data.data1[0]=temp2+D8028,PLC_Addr++,u32data.data1[1]=cos_value()+D8029,PLC_Addr-=2;break;//算出H的地址的Z0
case 0xA281: u32data.data1[0]=temp2+D8182,PLC_Addr++,u32data.data1[1]=cos_value()+D8183,PLC_Addr-=2;break;//算出H的地址的Z1
case 0xA282: u32data.data1[0]=temp2+D8184,PLC_Addr++,u32data.data1[1]=cos_value()+D8185,PLC_Addr-=2;break;//算出H的地址的Z2
case 0xA283: u32data.data1[0]=temp2+D8186,PLC_Addr++,u32data.data1[1]=cos_value()+D8187,PLC_Addr-=2;break;//算出H的地址的Z3
case 0xA284: u32data.data1[0]=temp2+D8188,PLC_Addr++,u32data.data1[1]=cos_value()+D8189,PLC_Addr-=2;break;//算出H的地址的Z4
case 0xA285: u32data.data1[0]=temp2+D8190,PLC_Addr++,u32data.data1[1]=cos_value()+D8191,PLC_Addr-=2;break;//算出H的地址的Z5
case 0xA286: u32data.data1[0]=temp2+D8192,PLC_Addr++,u32data.data1[1]=cos_value()+D8193,PLC_Addr-=2;break;//算出H的地址的Z6
case 0xA287: u32data.data1[0]=temp2+D8194,PLC_Addr++,u32data.data1[1]=cos_value()+D8195,PLC_Addr-=2;break;//算出H的地址的Z7
/************************************************K1M0寄存器"Z"*******************************************************************/
case 0xA482: mov_d_addr=+DZ0_Z3(temp2),D_data=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X0000000F,PLC_Addr++;break;//K1M0的V0-V3
case 0xA483: mov_d_addr=+DZ4_Z7(temp2),D_data=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X0000000F,PLC_Addr++;break;//K1M0的V4-V7
/************************************************K2M0寄存器"Z"*******************************************************************/
case 0xA484: mov_d_addr=+DZ0_Z3(temp2),D_data=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X000000FF,PLC_Addr++;break;//K2M0的V0-V3
case 0xA485: mov_d_addr=+DZ4_Z7(temp2),D_data=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X000000FF,PLC_Addr++;break;//K2M0的V4-V7
/************************************************K3M0寄存器"Z"*******************************************************************/
case 0xA486: mov_d_addr=+DZ0_Z3(temp2),D_data=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X00000FFF,PLC_Addr++;break;//K3M0的V0-V3
case 0xA487: mov_d_addr=+DZ4_Z7(temp2),D_data=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X00000FFF,PLC_Addr++;break;//K3M0的V4-V7
/************************************************K4M0寄存器"Z"*******************************************************************/
case 0xA488: mov_d_addr=+DZ0_Z3(temp2),D_data=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X0000FFFF,PLC_Addr++;break;//K4M0的V0-V3
case 0xA489: mov_d_addr=+DZ4_Z7(temp2),D_data=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X0000FFFF,PLC_Addr++;break;//K4M0的V4-V7
/************************************************K5M0寄存器"Z"*******************************************************************/
case 0xA48A: mov_d_addr=+DZ0_Z3(temp2),D_data=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X000FFFFF,PLC_Addr++;break;//K1M0的V0-V3
case 0xA48B: mov_d_addr=+DZ4_Z7(temp2),D_data=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X000FFFFF,PLC_Addr++;break;//K1M0的V4-V7
/************************************************K6M0寄存器"Z"*******************************************************************/
case 0xA48C: mov_d_addr=+DZ0_Z3(temp2),D_data=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X00FFFFFF,PLC_Addr++;break;//K2M0的V0-V3
case 0xA48D: mov_d_addr=+DZ4_Z7(temp2),D_data=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X00FFFFFF,PLC_Addr++;break;//K2M0的V4-V7
/************************************************K7M0寄存器"Z"*******************************************************************/
case 0xA48E: mov_d_addr=+DZ0_Z3(temp2),D_data=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X0FFFFFFF,PLC_Addr++;break;//K3M0的V0-V3
case 0xA48F: mov_d_addr=+DZ4_Z7(temp2),D_data=MOV_K(PLC_D_C_T_addr(temp2)/0x100)&0X0FFFFFFF,PLC_Addr++;break;//K3M0的V4-V7
/************************************************K8M0寄存器"Z"*******************************************************************/
case 0xA490: mov_d_addr=+DZ0_Z3(temp2),D_data=MOV_K(PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K4M0的V0-V3
case 0xA491: mov_d_addr=+DZ4_Z7(temp2),D_data=MOV_K(PLC_D_C_T_addr(temp2)/0x100),PLC_Addr++;break;//K4M0的V4-V7
/************************************************T寄存器"Z"*******************************************************************/
case 0xA682: {temp=(PLC_D_C_T_addr(temp2)+DZ0_Z3(temp2)*2);if(temp>=510) PLC_PROG_ERROR(M8067,6706),D_data=0; else D_data=PLC_RAM32(RAM_T_ADDR+temp),PLC_Addr++;}break;//算出T的地址的Z0-Z3
case 0xA683: {temp=(PLC_D_C_T_addr(temp2)+DZ4_Z7(temp2)*2);if(temp>=510) PLC_PROG_ERROR(M8067,6706),D_data=0; else D_data=PLC_RAM32(RAM_T_ADDR+temp),PLC_Addr++;}break;//算出T的地址的Z4-Z7
/************************************************C寄存器"Z"*******************************************************************/
case 0xA684: {temp=(PLC_D_C_T_addr(temp2)+DZ0_Z3(temp2)*2);if(temp>=510) PLC_PROG_ERROR(M8067,6706),D_data=0; else D_data=PLC_RAM32(RAM_C_ADDR+temp),PLC_Addr++;}break;//算出C的地址的Z0-Z3
case 0xA685: {temp=(PLC_D_C_T_addr(temp2)+DZ4_Z7(temp2)*2);if(temp>=510) PLC_PROG_ERROR(M8067,6706),D_data=0; else D_data=PLC_RAM32(RAM_C_ADDR+temp),PLC_Addr++;}break;//算出C的地址的Z4-Z7
/************************************************D寄存器"Z"*******************************************************************/
case 0xA686: {temp=(PLC_D_C_T_addr(temp2)+DZ0_Z3(temp2)*2);if(temp>=15998) PLC_PROG_ERROR(M8067,6706),D_data=0; else D_data=PLC_RAM32(RAM_D_ADDR+temp);PLC_Addr++;}break;//算出D的地址的Z0-Z3
case 0xA687: {temp=(PLC_D_C_T_addr(temp2)+DZ4_Z7(temp2)*2);if(temp>=15998) PLC_PROG_ERROR(M8067,6706),D_data=0; else D_data=PLC_RAM32(RAM_D_ADDR+temp);PLC_Addr++;}break;//算出D的地址的Z4-Z7
case 0xA688: {temp=(PLC_D_C_T_addr(temp2)+DZ0_Z3(temp2)*2);if(temp>=13998) PLC_PROG_ERROR(M8067,6706),D_data=0; else D_data=PLC_RAM32(RAM_D1000_ADDR+temp),PLC_Addr++;}break;//大于等于D1000的Z0-Z3
case 0xA689: {temp=(PLC_D_C_T_addr(temp2)+DZ4_Z7(temp2)*2);if(temp>=13998) PLC_PROG_ERROR(M8067,6706),D_data=0; else D_data=PLC_RAM32(RAM_D1000_ADDR+temp),PLC_Addr++;}break;//大于等于D1000的Z4-Z7
}
PLC_Addr+=2;
return D_data;
}
//=======================================================================================================
// 函数名称: static float float_value(void)
// 功能描述:
// 输 入: void
// 输 出: 输出float数据
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月19日
// 备 注:
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 备 注:
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
static float float_value(void)
{
u16 Type_F,temp1,temp2,Data1,Data2,Data3,Data4;
Data1=*PLC_Addr;
PLC_Addr++;
Data2=*PLC_Addr;
PLC_Addr++;
Data3=*PLC_Addr;
PLC_Addr++;
Data4=*PLC_Addr;
Type_F = (Data1 & 0xff00);
Type_F |= (Data2 >> 8);
/************************************/
temp1 = (Data2 << 8);
temp1 |=(u8)Data1;
/************************************/
temp2 = (Data4 << 8);
temp2 |=(u8)Data3;
/************************************/
if(Type_F == 0x8080) u32data.data1[0]=temp1,u32data.data1[1]=temp2, FLOAT.DATA=(float)u32data.data, PLC_Addr++;//算出K值
else if(Type_F == 0x8280) u32data.data1[0]=temp1,u32data.data1[1]=temp2, FLOAT.DATA=(float)u32data.data, PLC_Addr++;//算出H值
else if(Type_F == 0x8680) FLOAT.DATA=PLC_RAMfolta(RAM_D8000_ADDR+temp1),PLC_Addr++; //算出D的地址 D8000
else if(Type_F == 0x8682) FLOAT.DATA=PLC_RAMfolta(RAM_T_ADDR+temp1),PLC_Addr++; //算出T的地址
else if(Type_F == 0x8684) FLOAT.DATA=PLC_RAMfolta(RAM_C_ADDR+temp1),PLC_Addr++; //算出C的地址
else if(Type_F == 0x8686) FLOAT.DATA=PLC_RAMfolta(RAM_D_ADDR+temp1),PLC_Addr++; //算出D的地址
else if(Type_F == 0x8688) FLOAT.DATA=PLC_RAMfolta(RAM_D1000_ADDR+temp1),PLC_Addr++; //大于等于D1000
return FLOAT.DATA;
}
static void RST_D(void)
{
u8 temp,addr,l_value;
if(PLC_ACC_BIT&0x01)
{
l_value=*PLC_Addr;PLC_Addr++;addr=*PLC_Addr/0x100;
if(addr==0x86)
temp=l_value+((*PLC_Addr%0x100)*0x100),temp=0x0700+temp/2,PLC_16BIT[temp]=0;
else if(addr==0x88)
temp=l_value+((*PLC_Addr%0x100)*0x100),temp=0x1000+temp/2,PLC_16BIT[temp]=0;
else if(addr==0x80)
temp=l_value+((*PLC_Addr%0x100)*0x100),temp=0x1000+temp/2+1000,PLC_16BIT[temp]=0;
else {PLC_PROG_ERROR(M8065,6501);}
}
else PLC_Addr+=2;
}
//=======================================================================================================
// 函数名称: static void target(void)
// 功能描述: 加减法“与”“或”“异或”共用赋值函数 如DEMOV、DEADD、DESUB等指令的结果传递出去
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月23日
// 备 注:
//=======================================================================================================
static void float_target(void)
{
u16 temp;
temp=addr_value() ;
PLC_16BIT[temp]=FLOAT.DATA1[0];
PLC_16BIT[temp+1]=FLOAT.DATA1[1];
PLC_Addr+=2;
}
static void PID(void)
{
s16 PVn; // 测量值
s16 SV; // 设定目标Desired value
s16 Ts; // 取样时间
s32 Su;
s16 KP; // P
s16 Ti; // I
s16 KD; // D
s16 TD; // 微分增益
u32 Addr,Addr1; // 地址记录
u32 csp; // PID内部计算地址
if((PLC_ACC_BIT&0X01)==0X01) //母线成立不
{
SV=PLC_RAM16(addr_value_prog()); // 设定值
PVn=PLC_RAM16(addr_value_prog()); // 测量数据
Addr=addr_value_prog(); // 读取参数起始地址
Addr1= addr_value_prog();
Ts=PLC_RAM16(Addr); // 取样时间
KP=PLC_RAM16(Addr+6); // P
Ti=PLC_RAM16(Addr+8); // I
KD=PLC_RAM16(Addr+10); // D
TD=PLC_RAM16(Addr+12); // 微分增益
csp=Addr+14; // 内部计算起始地址
PLC_RAM16(csp+14)=KP*((PLC_RAM16(csp)-PLC_RAM16(csp+2))+((Ts/Ti)*PLC_RAM16(csp))+PLC_RAM16(csp+10));
PLC_RAM16(csp) = PLC_RAM16(csp+4) - SV; // 计算本次偏差值
PLC_RAM16(csp+4)= PLC_RAM16(Addr+4)*PLC_RAM16(csp+6)+(1-PLC_RAM16(Addr+4))*PVn;
PLC_RAM16(csp+10)=(TD/(Ts+KD*TD))*(-2*PLC_RAM16(csp+6)+PLC_RAM16(csp+4)+PLC_RAM16(csp+8))+((KD*TD)/(Ts+KD*TD))*PLC_RAM16(csp+12);
Su=PLC_RAM16(Addr1)+PLC_RAM16(csp+14);
if(Su>32766) PLC_RAM16(Addr1)=32767;
else if(Su<-32767) PLC_RAM16(Addr1)=-32768;
else PLC_RAM16(Addr1)= Su;
PLC_RAM16(csp+12)=PLC_RAM16(csp+10);
PLC_RAM16(csp+8)=PLC_RAM16(csp+6);
PLC_RAM16(csp+6)=PLC_RAM16(csp+4);
PLC_RAM16(csp+2)=PLC_RAM16(csp);
}
}
static void MOV(void) //MOV
{
if(PLC_ACC_BIT&0X01) //判断条件满足否
trade=cos_value(),target();
else
PLC_Addr+=4; //条件不满足执行跳过程序减小CPU开销
}
static void DMOV(void) //单精度数据传递
{
if(PLC_ACC_BIT&0X01)
trade=cos_u32_value(),D_target();
else
PLC_Addr+=8; //条件不满足执行跳过程序减小CPU开销
}
static void DEMOV(void) //单精度数据传递
{
if(PLC_ACC_BIT&0X01)
trade=float_value(),float_target();
else
PLC_Addr+=8; //条件不满足执行跳过程序减小CPU开销
}
//======================================================================================================
// 函数名称: static void ZRST(void)
// 功能描述: ZRST指令函数
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void ZRST(void)
{
u16 temp,temp1;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp=addr_value();
temp1=addr_value();
if(Flag_bit==0x00)
{
for(;temp<=temp1;temp++)
PLC_BIT_OFF(temp);
}
else
{
for(;temp<=temp1;temp++)
PLC_16BIT[temp]=0;
}
}
else PLC_Addr+=4;
}
static void MTR(void)
{
u16 X,Y,M_Y,K_H,temp=0;
u8 i,t;
if(PLC_ACC_BIT&0X01)
{
X=addr_value();
Y=addr_value();
M_Y=addr_value();
K_H=cos_value();
for(i=0;i<K_H;i++)
{
temp=i*7;
PLC_BIT_ON(Y+i);
for(t=0;t<=7;t++)
(PLC_BIT_TEST(X+t)) ? PLC_BIT_ON(M_Y+temp+t) : PLC_BIT_OFF(M_Y+temp+t);
}
}
else PLC_Addr+=8;
}
static void REFF(void)
{
if(PLC_ACC_BIT&0X01)
X_DIY=cos_value();
else X_DIY=10,PLC_Addr+=2;
}
//======================================================================================================
// 函数名称: static void DSQR(void)
// 功能描述: 32位开方计算 DSQR
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void DSQR(void)
{
if((PLC_ACC_BIT&0X01)==0X01)
{
trade=(u32)sqrt((double)cos_u32_value());
target();
}
}
static void HSCS(void) //高速计数置位
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if((temp2==temp1)&&((PLC_ACC_BIT&0X01)==0X01))
PLC_ACC_BIT|=1;
else
PLC_ACC_BIT&=~1;
}
//======================================================================================================
// 函数名称: static void SQR(void)
// 功能描述: 16位右移位 RCR指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void SQR(void)
{
if((PLC_ACC_BIT&0X01)==0X01)
{
trade=(u16)sqrt((double)cos_value());
target();
}
}
//======================================================================================================
// 函数名称: static void DRCR(void)
// 功能描述: 32位右移位 RCR指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void DRCR(void)
{
u32 temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_u32_value();
temp2=cos_u32_value();
trade=temp1>>temp2;
PLC_Addr-=8;
D_target();
PLC_Addr+=4;
}
}
//======================================================================================================
// 函数名称: static void RCR(void)
// 功能描述: 16位右移位 RCR指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void RCR(void)
{
u16 temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_value();
temp2=cos_value();
trade=temp1>>temp2;
PLC_Addr-=4;
target();
PLC_Addr+=2;
}
else PLC_Addr+=4; //没有动作跳过4步程序
}
//======================================================================================================
// 函数名称: static void DROL(void)
// 功能描述: 32位左移位 RCL指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void DRCL(void)
{
u32 temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_u32_value();
temp2=cos_u32_value();
trade=temp1<<temp2;
PLC_Addr-=8;
D_target();
PLC_Addr+=4;
}
}
//======================================================================================================
// 函数名称: static void ROL(void)
// 功能描述: 16位左移位 RCL指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void RCL(void)
{
u16 temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_value();
temp2=cos_value();
trade=temp1<<temp2;
PLC_Addr-=4;
target();
PLC_Addr+=2;
}
else PLC_Addr+=4; //没有动作跳过4步程序
}
//======================================================================================================
// 函数名称: static void DROR(void)
// 功能描述: 32位循环右位 ROR指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void DROR(void)
{
u32 temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_u32_value();
temp2=cos_u32_value();
trade=ROTATE_RIGHT(temp1,32,temp2);
PLC_Addr-=8;
D_target();
PLC_Addr+=4;
}
}
//======================================================================================================
// 函数名称: static void ROR(void)
// 功能描述: 16位循环右位 ROR指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void ROR(void)
{
u16 temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_value();
temp2=cos_value();
trade=ROTATE_RIGHT(temp1,16,temp2);
PLC_Addr-=4;
target();
PLC_Addr+=2;
}
else PLC_Addr+=4; //没有动作跳过4步程序
}
//======================================================================================================
// 函数名称: static void DROL(void)
// 功能描述: 32位循环左移位 ROL指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void DROL(void)
{
u32 temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_u32_value();
temp2=cos_u32_value();
trade=ROTATE_LEFT(temp1,32,temp2);
PLC_Addr-=8;
D_target();
PLC_Addr+=4;
}
}
//======================================================================================================
// 函数名称: static void ROL(void)
// 功能描述: 16位循环左移位 ROL指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void ROL(void)
{
u16 temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_value();
temp2=cos_value();
trade=ROTATE_LEFT(temp1,16,temp2);
PLC_Addr-=4;
target();
PLC_Addr+=2;
}
else PLC_Addr+=4; //没有动作跳过4步程序
}
//======================================================================================================
// 函数名称: static void DSWAP(void)
// 功能描述: 32位上下交换 DSWAP指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void DSWAP(void)
{
u32 temp;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp=cos_u32_value();
trade=swap_u32(temp);
PLC_Addr-=4;
D_target();
}
}
//=======================================================================================================
// 函数名称: static void DGBIN(void)
// 功能描述: 16位上下交换 DGBIN指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年8月4日
// 备 注:
//=======================================================================================================
static void DGBIN(void)
{
signed int temp;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp=cos_value();
trade=GtoB(temp);
D_target();
}
else PLC_Addr+=8; //没有动作跳过8步程序
}
//=======================================================================================================
// 函数名称: static void GBIN(void)
// 功能描述: 16位上下交换 GBIN指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void GBIN(void)
{
signed short int temp;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp=cos_value();
trade=(u16)GtoB((unsigned int)temp);
target();
}
else PLC_Addr+=4; //没有动作跳过4步程序
}
//=======================================================================================================
// 函数名称: static void DGRY(void)
// 功能描述: 16位上下交换 DGRY指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年8月4日
// 备 注:
//=======================================================================================================
static void DGRY(void)
{
signed int temp;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp=cos_value();
trade=BtoG(temp);
D_target();
}
else PLC_Addr+=8; //没有动作跳过8步程序
}
//=======================================================================================================
// 函数名称: static void GRY(void)
// 功能描述: 16位上下交换 GRY指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void GRY(void)
{
signed short int temp;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp=cos_value();
trade=(u16)BtoG((unsigned int)temp);
target();
}
else PLC_Addr+=4; //没有动作跳过4步程序
}
//=======================================================================================================
// 函数名称: static void SWAP(void)
// 功能描述: 16位上下交换 SWAP指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void SWAP(void)
{
signed short int temp;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp=cos_value();
trade=swap_u16(temp);
PLC_Addr-=2;
target();
}
else PLC_Addr+=4; //没有动作跳过4步程序
}
//=======================================================================================================
// 函数名称: static void SFTR(void)
// 功能描述: SFTR指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年8月9日
// 备 注:
//=======================================================================================================
//static void SFTR(void)
//{
//signed short int addr1,addr2,temp1,temp2,temp5,temp6,i;
// u8 temp3,temp4;
// if(PLC_ACC_BIT&0X01)
// {
// addr1=addr_value();
// Flag_bit=0xff;
//
// addr2=addr_value();
// Flag_bit=0xff;
//
// temp1=cos_value();
// temp5=cos_value();
// temp2=temp5+temp4;
// temp6=temp1-temp5;
// for(i=0;i<temp6;i++)
// {
// (PLC_BIT_TEST(addr2+i)) ? PLC_BIT_ON(addr2+i) : PLC_BIT_OFF(addr2+i);
// }
// for(;i<temp1;i++)
// {
// (PLC_BIT_TEST(addr1+i)) ? PLC_BIT_ON(addr2+i) : PLC_BIT_OFF(addr2+i);
// }
// }
// else PLC_Addr+=8; //没有动作跳过4步程序
//}
//=======================================================================================================
// 函数名称: static void XCH(void)
// 功能描述: 16位交换传送 XCH指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void XCH(void)
{
signed short int temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_value();
temp2=cos_value();
PLC_Addr-=4;
trade=temp2;
D_target();
trade=temp1;
D_target();
}
else PLC_Addr+=4; //没有动作跳过4步程序
}
//=======================================================================================================
// 函数名称: static void DFMOV(void)
// 功能描述: 32位交换传送 DXCH指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void DXCH(void)
{
signed int temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_u32_value();
temp2=cos_u32_value();
PLC_Addr-=8;
trade=temp2;
D_target();
trade=temp1;
D_target();
}
}
//=======================================================================================================
// 函数名称: static void DFMOV(void)
// 功能描述: 32位多点传送 DFMOV指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void DFMOV(void)
{
signed short int temp,i;
if((PLC_ACC_BIT&0X01)==0X01)
{
trade=cos_u32_value(); //要传递的数据
D_target(); //把第一个传递出去
temp=cos_u32_value(); // <<<-------------|
PLC_Addr-=4; //PLC_Addr-=4是为了调回到上面 |<<-----|
for(i=1;i<temp;i++) // |
{ // |
if(Transfer_bit==1)Transfer=i*32;// |
else Transfer=i*4; // |
PLC_Addr-=4;D_target(); //PLC_Addr-=4是为了传递出去要的位数 |
} // |
PLC_Addr+=2;Transfer=0; //PLC_Addr+=2是为了跳过上面调回去的---|
}
}
//=======================================================================================================
// 函数名称: static void FMOV(void)
// 功能描述: 16位多点传送 FMOV指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void FMOV(void)
{
signed short int temp,i;
if((PLC_ACC_BIT&0X01)==0X01)
{
trade=cos_value(); //要传递的数据
target(); //把第一个传递出去
temp=cos_value(); // <<<-------------|
PLC_Addr-=2; //PLC_Addr-=2是为了调回到上面 |<<-----|
for(i=1;i<temp;i++) // |
{ // |
if(Transfer_bit==1)Transfer=i*16;// |
else Transfer=i*2; // |
PLC_Addr-=2;target(); //PLC_Addr-=2是为了传递出去要的位数 |
} // |
PLC_Addr+=2;Transfer=0; //PLC_Addr+=2是为了跳过上面调回去的---|
}
else PLC_Addr+=6; //没有动作跳过6步程序
}
//=======================================================================================================
// 函数名称: static void FMOV(void)
// 功能描述: 16位成批传送 BMOV指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年6月27日
// 备 注:
//=======================================================================================================
static void BMOV(void)
{
signed short int temp,i;
if((PLC_ACC_BIT&0X01)==0X01)
{
trade=cos_value(); //要传递的数据
target(); //把第一个传递出去
temp=cos_value();
PLC_Addr-=2; //<<<---------------------------------|
for(i=1;i<temp;i++) // |
{ // |
if(Transfer_bit1==1)Transfer=i*16;// |
else Transfer=i*2; // |
PLC_Addr-=4; //
trade=cos_value(); //要传递的数据
if(Transfer_bit==1)Transfer=i*16;
else Transfer=i*2;
target(); //把第传递出去
} // |
PLC_Addr+=2;Transfer=0; //PLC_Addr+=2是为了跳过上面调回去的-----|
}
else PLC_Addr+=6; //按键没按下就跳过6步程序
}
static void DCML(void) //32位数据取反
{
s32 temp1;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_u32_value();
trade=~temp1;
D_target();
}
else PLC_Addr+=8; //跳过8步程序
}
static void CML(void) //数据取反
{
signed short int temp1;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_value();
trade=~temp1;
target();
}
else PLC_Addr+=4; //跳过4步程序
}
u16 bcd[4]={0x1,0x10,0x100,0x1000};
static void SMOV(void) //16位比较传送指令
{
u16 temp1,temp2,temp3,temp4,temp5,temp6;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_value();
temp2=cos_value();
temp3=cos_value();
temp4=addr_value();
temp5=cos_value();
temp1%=bcd[temp2];
for(temp6=0;temp6<temp3;temp6++)
{
temp2--;temp5--;
PLC_16BIT[temp4]|=(temp1/bcd[temp2])*bcd[temp5];
if((temp2==1)&&(temp5==1))PLC_16BIT[temp4]|=temp1%0x10*bcd[temp5], temp6=temp3+1;
else temp1%=bcd[temp2];
}
}
else PLC_Addr+=10; //跳过10步程序
}
//======================================================================================================
// 函数名称: static void TZCP(void)
// 功能描述TZCP指令函数
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年7月26日
// 备 注:
//=======================================================================================================
static void TZCP(void)
{
u16 h,min,s,temp,temp1,temp3,temp4,h1,min1,s1;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp3=addr_value(); //S1 区域比较下限值
h=PLC_16BIT[temp3];
min=PLC_16BIT[temp3+1];
s=PLC_16BIT[temp3+2];
temp4=addr_value(); //S2 区域比较上限值
h1=PLC_16BIT[temp4];
min1=PLC_16BIT[temp4+1];
s1=PLC_16BIT[temp4+2];
temp=addr_value(); //S3 时间比较值
temp1=addr_value();Flag_bit=0XFF;
PLC_BIT_OFF(temp1);PLC_BIT_OFF(temp1+1);PLC_BIT_OFF(temp1+2);
if((h>=PLC_16BIT[temp])&&(min>=PLC_16BIT[temp+1])&&(s>PLC_16BIT[temp+2]))
{PLC_BIT_ON(temp1);}
else if(((h<=PLC_16BIT[temp])&&(min<=PLC_16BIT[temp+1])&&(s<=PLC_16BIT[temp+1]))&&((h1>=PLC_16BIT[temp])&&(min1>=PLC_16BIT[temp+1])&&(s1>=PLC_16BIT[temp+2])))
{PLC_BIT_ON(temp1+1);}
else if((h1<=PLC_16BIT[temp])&&(min1<=PLC_16BIT[temp+1])&&(s1<PLC_16BIT[temp+2]))
{PLC_BIT_ON(temp1+2);}
}
}
static void EZCP(void) //16位比较传送指令
{
float temp1,temp2,temp3;u32 temp4;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=float_value();
temp2=float_value();
temp3=float_value();
temp4=addr_value();Flag_bit=0XFF;
PLC_BIT_OFF(temp4);PLC_BIT_OFF(temp4+1);PLC_BIT_OFF(temp4+2);
if(temp1>temp3) PLC_BIT_ON(temp4+0);
else if((temp1<=temp3)&&(temp3<=temp2)) PLC_BIT_ON(temp4+1);
else if(temp2<temp3) PLC_BIT_ON(temp4+2);
}
else PLC_Addr+=16; //跳过16步程序
}
static void DZCP(void) //16位比较传送指令
{
s32 temp1,temp2,temp3,temp4;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_u32_value();
temp2=cos_u32_value();
temp3=cos_u32_value();
temp4=addr_value();Flag_bit=0XFF;
PLC_BIT_OFF(temp4);PLC_BIT_OFF(temp4+1);PLC_BIT_OFF(temp4+2);
if(temp1>temp3) PLC_BIT_ON(temp4);
else if((temp1<=temp3)&&(temp3<=temp2)) PLC_BIT_ON(temp4+1);
else if(temp2<temp3) PLC_BIT_ON(temp4+2);
}
else PLC_Addr+=16; //跳过16步程序
}
static void ZCP(void) //16位比较传送指令
{
signed short int temp1,temp2,temp3,temp4;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_value();
temp2=cos_value();
temp3=cos_value();
temp4=addr_value();Flag_bit=0XFF;
PLC_BIT_OFF(temp4);PLC_BIT_OFF(temp4+1);PLC_BIT_OFF(temp4+2);
if(temp1>temp3) PLC_BIT_ON(temp4);
else if((temp1<=temp3)&&(temp3<=temp2)) PLC_BIT_ON(temp4+1);
else if(temp2<temp3) PLC_BIT_ON(temp4+2);
}
else PLC_Addr+=8; //跳过8步程序
}
//======================================================================================================
// 函数名称: static void TCMP(void)
// 功能描述TCMP指令函数
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年7月26日
// 备 注:
//=======================================================================================================
static void TCMP(void)
{
u16 h,min,s,temp,temp1;
if((PLC_ACC_BIT&0X01)==0X01)
{
h=cos_value();min=cos_value();s=cos_value();
temp=addr_value();
temp1=addr_value();Flag_bit=0XFF;
PLC_BIT_OFF(temp1);PLC_BIT_OFF(temp1+1);PLC_BIT_OFF(temp1+2);
if((h>=PLC_16BIT[temp])&&(min>=PLC_16BIT[temp+1])&&(s>PLC_16BIT[temp+2]))
{PLC_BIT_ON(temp1);}
else if((h==PLC_16BIT[temp])&&(min==PLC_16BIT[temp+1])&&(s==PLC_16BIT[temp+2]))
{PLC_BIT_ON(temp1+1);}
else if((h<=PLC_16BIT[temp])&&(min<=PLC_16BIT[temp+1])&&(s<PLC_16BIT[temp+2]))
{PLC_BIT_ON(temp1+2);}
}
else PLC_Addr+=10;
}
//======================================================================================================
// 函数名称: static void ECMP(void)
// 功能描述ECMP指令函数
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年7月26日
// 备 注:
//=======================================================================================================
static void ECMP(void) //浮点比较传送指令
{
signed short int temp3;
static float temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=float_value();
temp2=float_value();
temp3=addr_value();Flag_bit=0XFF;
PLC_BIT_OFF(temp3);PLC_BIT_OFF(temp3+1);PLC_BIT_OFF(temp3+2);
if(temp1>temp2) PLC_BIT_ON(temp3);
else if(temp1==temp2) PLC_BIT_ON(temp3+1);
else if(temp1<temp2) PLC_BIT_ON(temp3+2);
}
else PLC_Addr+=12; //跳过12步程序
}
//======================================================================================================
// 函数名称: static void DCMP(void)
// 功能描述DCMP指令函数
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年7月26日
// 备 注:
//=======================================================================================================
static void DCMP(void) //32位比较传送指令
{
signed short int temp3;
static int temp1,temp2;
if(PLC_ACC_BIT&0X01)
{
temp1=cos_u32_value();
temp2=cos_u32_value();
temp3=addr_value();Flag_bit=0XFF;
PLC_BIT_OFF(temp3);PLC_BIT_OFF(temp3+1);PLC_BIT_OFF(temp3+2);
if(temp1>temp2) PLC_BIT_ON(temp3+0);
else if(temp1==temp2) PLC_BIT_ON(temp3+1);
else if(temp1<temp2) PLC_BIT_ON(temp3+2);
}
else PLC_Addr+=12; //跳过12步程序
}
static void DCMPP(void)
{
signed short int temp3;
static int temp1,temp2;
if(PLC_LDP_TEST()) //上升沿判断
{
temp1=cos_u32_value();
temp2=cos_u32_value();
temp3=addr_value();Flag_bit=0XFF;
PLC_BIT_OFF(temp3);PLC_BIT_OFF(temp3+1);PLC_BIT_OFF(temp3+2);
if(temp1>temp2) PLC_BIT_ON(temp3+0);
else if(temp1==temp2) PLC_BIT_ON(temp3+1);
else if(temp1<temp2) PLC_BIT_ON(temp3+2);
}
else
PLC_Addr+=12; //条件不满足执行跳过程序减小CPU开销
}
//======================================================================================================
// 函数名称: static void CMP(void)
// 功能描述CMP指令函数
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年7月26日
// 备 注:
//=======================================================================================================
static void CMP(void) //16位比较传送指令
{
signed short int temp1,temp2,temp3;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_value();
temp2=cos_value();
temp3=addr_value();Flag_bit=0XFF;
PLC_BIT_OFF(temp3);PLC_BIT_OFF(temp3+1);PLC_BIT_OFF(temp3+2);
if(temp1>temp2) PLC_BIT_ON(temp3);
else if(temp1==temp2) PLC_BIT_ON(temp3+1);
else if(temp1<temp2) PLC_BIT_ON(temp3+2);
}
else PLC_Addr+=6; //跳过6步程序
}
//======================================================================================================
// 函数名称: static void CMP_P(void)
// 功能描述CMPP指令函数
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年8月26日
// 备 注:
//=======================================================================================================
static void CMPP(void)
{
signed short int temp1,temp2,temp3;
if(PLC_LDP_TEST()) //上升沿判断
{
temp1=cos_value();
temp2=cos_value();
temp3=addr_value();Flag_bit=0XFF;
PLC_BIT_OFF(temp3);PLC_BIT_OFF(temp3+1);PLC_BIT_OFF(temp3+2);
if(temp1>temp2) PLC_BIT_ON(temp3);
else if(temp1==temp2) PLC_BIT_ON(temp3+1);
else if(temp1<temp2) PLC_BIT_ON(temp3+2);
}
else
PLC_Addr+=6; //条件不满足执行跳过程序减小CPU开销
}
static void DINC(void) //32位逻辑运算 加1指令
{
if((PLC_ACC_BIT&0X01)==0X01)
{
trade=(u32)cos_u32_value()+1;
PLC_Addr-=4;
D_target();
}
else PLC_Addr+=4; //跳过4步程序
}
static void DINC_P(void) //CALLP
{
if(PLC_PL_BIT_TEST(PLC_Addr-PLC_START_Address)==off)//上升沿判断
{
if(PLC_ACC_BIT&0X01) //当前值判断
{
PLC_PL_BIT_ON(PLC_Addr-PLC_START_Address);
trade=(u32)cos_u32_value()+1;
PLC_Addr-=4;
trade++;
D_target();
}
else PLC_Addr+=4;
}
else
{
if(!((PLC_ACC_BIT&0x01)==0x01)) //当前值判断
PLC_PL_BIT_OFF(PLC_Addr-PLC_START_Address);//
PLC_Addr+=4; //条件不满足执行跳过程序减小CPU开销
}
}
static void INC(void) //逻辑运算 加1指令
{
if((PLC_ACC_BIT&0X01)==0X01)
{
trade=cos_value();
PLC_Addr-=2;
trade++;
target();
}
else PLC_Addr+=2; //跳过2步程序
}
static void INCP(void) //INCP
{
if(PLC_LDP_TEST())//上升沿判断
{
trade=cos_value();
PLC_Addr-=2;
trade++;
target();
}
else
{
PLC_Addr+=2; //条件不满足执行跳过程序减小CPU开销
}
}
static void DDEC(void) //32位逻辑运算 减1指令
{
if((PLC_ACC_BIT&0X01)==0X01)
{
trade=cos_u32_value()-1;
PLC_Addr-=4;
D_target();
}
else PLC_Addr+=4; //跳过4步程序
}
static void DEC(void) //逻辑运算 减1指令
{
if(PLC_ACC_BIT&0X01)
{
trade=cos_value()-1;
PLC_Addr-=2;
target();
}
else PLC_Addr+=2; //跳过2步程序
}
static void DECP(void) //INCP
{
if(PLC_LDP_TEST()) //上升沿判断
{
trade=cos_value()-1;
PLC_Addr-=2;
target();
}
else
PLC_Addr+=2; //条件不满足执行跳过程序减小CPU开销
}
static void DNEG(void) //32位逻辑运算取补码
{
if((PLC_ACC_BIT&0X01)==0X01)
{
trade=0-cos_u32_value();
PLC_Addr-=4;
D_target();
}
else PLC_Addr+=4; //跳过4步程序
}
static void NEG(void) //逻辑运算取补码
{
if((PLC_ACC_BIT&0X01)==0X01)
{
trade=0-cos_value();
PLC_Addr-=2;
target();
}
else PLC_Addr+=2; //跳过2步程序
}
static void DWAND(void) //逻辑运算“与”
{
u32 temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_u32_value();
temp2=cos_u32_value();;
trade=temp1&temp2;
D_target();
}
else PLC_Addr+=12; //跳过12步程序
}
static void WAND(void) //逻辑运算“与”
{
signed short int temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_value();
temp2=cos_value();
trade=temp1&temp2;
target();
}
else PLC_Addr+=6; //跳过6步程序
}
static void DWOR(void) //逻辑运算“或”
{
u32 temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_u32_value();
temp2=cos_u32_value();;
trade=temp1|temp2;
D_target();
}
else PLC_Addr+=12; //跳过12步程序
}
static void WOR(void) //逻辑运算“或”
{
signed short int temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_value();
temp2=cos_value();
trade=temp1|temp2;
target();
}
else PLC_Addr+=6; //跳过6步程序
}
static void DWXOR(void) //逻辑运算“异或”
{
u32 temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1=cos_u32_value();
temp2=cos_u32_value();
trade=temp1^temp2;
D_target();
}
else PLC_Addr+=12; //跳过12步程序
}
static void WXOR(void) //逻辑运算“异或”
{
if((PLC_ACC_BIT&0X01)==0X01)
{
trade=cos_value()^cos_value();
target();
}
else PLC_Addr+=6; //跳过6步程序
}
//======================================================================================================
// 函数名称: static void TADD(void)
// 功能描述TADD指令函数
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年7月26日
// 备 注:
//=======================================================================================================
static void TADD(void)
{
u16 temp,temp1,temp2;
if(PLC_ACC_BIT&0X01)
{
temp1=addr_value();
temp2=addr_value();
temp=addr_value();
PLC_16BIT[temp]=PLC_16BIT[temp1]+PLC_16BIT[temp2];
PLC_16BIT[temp+1]=PLC_16BIT[temp1+1]+PLC_16BIT[temp2+1];
PLC_16BIT[temp+2]=PLC_16BIT[temp1+2]+PLC_16BIT[temp2+2];
}
}
void MEAN(void)
{
u16 temp,temp2;uint64_t data;u32 temp1;
if(PLC_ACC_BIT&0X01)
{
temp1=addr_value_prog();
PLC_Addr+=2; //些跳过输出
temp2=cos_value();
if(Flag_bit==0xff) //是不是K4M0之类的寄存器
{
for(temp=0;temp<temp2;temp++)
{data+=PLC_RAM16(temp1+temp*2);}
PLC_Addr-=4; //跳回输出
}
else
{
data=(u16)temp1;
PLC_Addr-=4; //回跳
for(temp=1;temp<temp2;temp++)
{
PLC_Addr-=2;
Transfer=temp*16;
data+=addr_value_prog();
}
Flag_bit=0xff;
}
trade=data/temp2;
target();
PLC_Addr+=2;
}
else PLC_Addr+=6;
}
//=======================================================================================================
// 函数名称: static void ADD(void)
// 功能描述: 16位交换传送 ADD指令 加法
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年8月4日
// 备 注:
//=======================================================================================================
static void ADD(void)
{
if(PLC_ACC_BIT&0X01)
{
trade=cos_value()+cos_value();
target();
}
else PLC_Addr+=6; //跳过6步程序
}
//=======================================================================================================
// 函数名称: static void ALT(void)
// 功能描述: 16位交换传送 ALT指令
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年8月4日
// 备 注:
//=======================================================================================================
static void ALT(void)
{
signed int temp;
if(PLC_ACC_BIT&0X01)
{
temp=addr_value();
if(PLC_BIT_TEST(temp))
PLC_BIT_OFF(temp);
else
PLC_BIT_ON(temp);
}
else PLC_Addr+=2; //没有动作跳过2步程序
}
//======================================================================================================
// 函数名称: static void TRD(void)
// 功能描述TRD指令函数
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年7月26日
// 备 注:
//=======================================================================================================
static void TRD(void)
{
u16 temp;
if(PLC_ACC_BIT&0X01)
{
temp=addr_value();
PLC_16BIT[temp]=PLC_16BIT[0x712];
PLC_16BIT[temp+1]=PLC_16BIT[0x711];
PLC_16BIT[temp+2]=PLC_16BIT[0x710];
PLC_16BIT[temp+3]=PLC_16BIT[0x70F];
PLC_16BIT[temp+4]=PLC_16BIT[0x70E];
PLC_16BIT[temp+5]=PLC_16BIT[0X70D];
PLC_16BIT[temp+6]=PLC_16BIT[0X713];
//读取年月日时分秒和星期
}
else PLC_Addr+=2; //跳过2步程序
}
//======================================================================================================
// 函数名称: static void TWR(void)
// 功能描述TWR指令函数
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年7月26日
// 备 注:
//=======================================================================================================
static void TWR(void)
{
u16 temp;
if(PLC_ACC_BIT&0X01)
{
temp=addr_value();
RTC_Set(PLC_16BIT[temp],PLC_16BIT[temp+1],PLC_16BIT[temp+2],PLC_16BIT[temp+3],PLC_16BIT[temp+4],PLC_16BIT[temp+5]);
//写入年月日时分秒
}
else PLC_Addr+=2; //跳过2步程序
}
//======================================================================================================
// 函数名称: static void TSUB(void)
// 功能描述TSUB指令函数
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2015年7月26日
// 备 注:
//=======================================================================================================
static void TSUB(void)
{
u16 temp,temp1,temp2;
if(PLC_ACC_BIT&0X01)
{
temp1=addr_value();
temp2=addr_value();
temp=addr_value();
PLC_16BIT[temp]=PLC_16BIT[temp1]-PLC_16BIT[temp2];
PLC_16BIT[temp+1]=PLC_16BIT[temp1+1]-PLC_16BIT[temp2+1];
PLC_16BIT[temp+2]=PLC_16BIT[temp1+2]-PLC_16BIT[temp2+2];
//时分秒减法
}
}
static void SUB(void) //减法
{
if(PLC_ACC_BIT&0X01)
{
PLC_Err=PLC_Addr;
trade=cos_value()-cos_value();
target();
}
else PLC_Addr+=6; //跳过6步程序
}
static void DBCD(void) //二进制转换DBCD
{
signed int can1,add1,add2,add3,add4,buffer1,buffer2,buffer3,buffer4;
if(PLC_ACC_BIT&0X01)
{
PLC_Err=PLC_Addr;
can1=cos_u32_value();
add1=can1%10;
add2=can1/10;
add2=add2%10;
add3=can1/100;
add3=add3%10;
add4=can1/1000;
add4=add4%10;
buffer1=can1/10000;
buffer1=buffer1%10;
buffer2=can1/100000;
buffer2=buffer2%10;
buffer3=can1/1000000;
buffer3=buffer3%10;
buffer4=can1/10000000;
buffer4=buffer4%10;
trade=buffer4*16*256*65536+buffer3*256*65536+buffer2*16*65536+buffer1*65536+add4*16*256+add3*256+add2*16+add1;
D_target();
}
else PLC_Addr+=8; //跳过4步程序
}
static void BCD(void) //二进制转换BCD
{
signed short Ia, Ic;
if((PLC_ACC_BIT&0X01)==0X01)
{
PLC_Err=PLC_Addr;
Ic = cos_value();
Ia = (Ic / 1000) << 12;
Ic %= 1000;
Ia |= (Ic / 100 ) << 8;
Ic %= 100;
Ia |= (Ic / 10 ) << 4;
Ic %= 10;
Ia |= Ic;
trade=Ia;
target();
}
else PLC_Addr+=4; //跳过4步程序
}
static void DBIN(void) //二进制转换DBIN
{
signed int can1,add1,add2,add3,add4,buffer1,buffer2,buffer3,buffer4;
if(PLC_ACC_BIT&0X01)
{
PLC_Err=PLC_Addr;
can1=cos_u32_value();
add1=can1%16;
add2=can1/16;
add2=add2%16;
add3=can1/256;
add3=add3%16;
add4=can1/(16*256);
add4=add4%16;
can1=can1/65536;
buffer1=can1%16;
buffer2=can1/16;
buffer2=buffer2%16;
buffer3=can1/256;
buffer3=buffer3%16;
buffer4=can1/(16*256);
buffer4=buffer4%16;
trade=buffer4*10000000+buffer3*1000000+buffer2*100000+buffer1*10000+add4*1000+add3*100+add2*10+add1;
D_target();
}
else PLC_Addr+=8; //跳过4步程序
}
static void BIN(void) //二进制转换BIN
{
signed short Ia, Ic;
if((PLC_ACC_BIT&0X01)==0X01)
{
PLC_Err=PLC_Addr;
Ic = cos_value();
Ia = ((Ic >> 12) & 0x0f) * 1000;
Ia += ((Ic >> 8 ) & 0x0f) * 100;
Ia += ((Ic >> 4 ) & 0x0f) * 10;
Ia += Ic & 0x0f;
trade=Ia;
target();
}
else PLC_Addr+=4; //跳过4步程序
}
static void MUL(void) //乘法
{
signed int temp1,temp2;u32 temp3;
if((PLC_ACC_BIT&0X01)==0X01)
{
PLC_Err=PLC_Addr;
temp1=cos_value();
temp2=cos_value();
temp3=addr_value_prog();
PLC_RAM32(temp3)=temp1*temp2;
}
else PLC_Addr+=6; //跳过6步程序
}
static void DIV(void) //除法
{
signed short int temp1,temp2,temp3;
if((PLC_ACC_BIT&0X01)==0X01)
{
PLC_Err=PLC_Addr;
temp1=cos_value();
temp2=cos_value();
temp3=addr_value();
PLC_16BIT[temp3]=temp1/temp2;
PLC_16BIT[temp3+1]=temp1%temp2;
}
else PLC_Addr+=6; //跳过6步程序
}
static void DADD(void)
{
if((PLC_ACC_BIT&0X01)==0X01)
{
PLC_Err=PLC_Addr;
trade=cos_u32_value()+cos_u32_value();
D_target();
}
else PLC_Addr+=12; //跳过12步程序
}
static void DSUB(void)
{
if((PLC_ACC_BIT&0X01)==0X01)
{
PLC_Err=PLC_Addr;
trade=cos_u32_value()-cos_u32_value();
D_target();
}
else PLC_Addr+=12; //跳过12步程序
}
static void DMUL(void)
{
signed short int temp;
if(PLC_ACC_BIT&0X01)
{
u64data.data=(int64_t)(cos_u32_value()*cos_u32_value()); //些存放64位共同体
temp=addr_value(); PLC_Addr+=2;
PLC_16BIT[temp] = u64data.data1[0]; //输出
PLC_16BIT[temp+1] = u64data.data1[1];
PLC_16BIT[temp+2] = u64data.data1[2];
PLC_16BIT[temp+3] = u64data.data1[3];
}
else PLC_Addr+=12; //跳过12步程序
}
static void DDIV(void)
{
signed short int temp1,temp2,temp3;
if(PLC_ACC_BIT&0X01)
{
temp1 = cos_u32_value();
temp2 = cos_u32_value();
u32data.data=temp1/temp2; //商
u32data1.data=temp1%temp2; //余数
temp3=addr_value() ;PLC_Addr+=2;
PLC_16BIT[temp3] = u32data.data1[0]; //输出
PLC_16BIT[temp3+1]=u32data.data1[1];
PLC_16BIT[temp3+2]=u32data1.data1[0];
PLC_16BIT[temp3+3]=u32data1.data1[1];
}
else PLC_Addr+=12; //跳过12步程序
}
static void DFLT(void) //整数转浮点
{
signed int temp1;
if(PLC_ACC_BIT&0X01)
{
temp1=cos_u32_value();
trade1=(float)temp1;
float_target();
}
else PLC_Addr+=8; //跳过8步程序
}
//======================================================================================================
// 函数名称: static void DESQR(void)
// 功能描述: 浮点二进制换整数
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2014年6月27日
// 备 注:
//=======================================================================================================
static void DINT(void)
{
if(PLC_ACC_BIT&0X01)
{
trade=(u32)float_value();
D_target();
}
else PLC_Addr+=8; //跳过8步程序
}
//======================================================================================================
// 函数名称: static void INT(void)
// 功能描述: 浮点二进制换整数
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2014年6月27日
// 备 注:
//=======================================================================================================
static void INT(void)
{
if(PLC_ACC_BIT&0X01)
{
trade=(u16)float_value();
PLC_Addr-=2;
target();
}
else PLC_Addr+=4; //跳过4步程序
}
//======================================================================================================
// 函数名称: static void FLT(void)
// 功能描述: 整数转浮点 FLT
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2014年6月27日
// 备 注:
//=======================================================================================================
static void FLT(void)
{
if(PLC_ACC_BIT&0X01)
{
trade1=(float)cos_value();
float_target();PLC_Addr-=2;
}
else PLC_Addr+=4; //跳过4步程序
}
//======================================================================================================
// 函数名称: static void DTAN(void)
// 功能描述: 浮点正切 DTAN
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2014年6月27日
// 备 注:
//=======================================================================================================
static void DTAN(void)
{
if(PLC_ACC_BIT&0X01)
{
trade1=(float)tan((double)float_value());
float_target();
}
else PLC_Addr+=8; //跳过8步程序
}
//======================================================================================================
// 函数名称: static void DCOS(void)
// 功能描述: 浮点正余 DCOS
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2014年6月27日
// 备 注:
//=======================================================================================================
static void DCOS(void)
{
if(PLC_ACC_BIT&0X01)
{
trade1=(float)cos((double)float_value());
float_target();
}
else PLC_Addr+=8; //跳过8步程序
}
//======================================================================================================
// 函数名称: static void DSIN(void)
// 功能描述: 浮点正弦 DSIN
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2014年6月27日
// 备 注:
//=======================================================================================================
static void DSIN(void)
{
if(PLC_ACC_BIT&0X01)
{
trade1=(float)sin((double)float_value());
float_target();
}
else PLC_Addr+=8; //跳过8步程序
}
//======================================================================================================
// 函数名称: static void DESQR(void)
// 功能描述: 浮点开方计算 DESQR
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2014年6月27日
// 备 注:
//=======================================================================================================
static void DESQR(void)
{
if(PLC_ACC_BIT&0X01)
{
trade1=(float)sqrt((double)float_value());
float_target();
}
else PLC_Addr+=8; //跳过8步程序
}
//======================================================================================================
// 函数名称: static void DEADD(void)
// 功能描述: 浮点加法运算 指令DEADD
// 输 入: void
// 输 出: void
// 全局变量:
// 调用模块:
// 作 者: 小小晟
// 日 期: 2014年6月27日
// 备 注:
//=======================================================================================================
static void DEADD(void)
{
if(PLC_ACC_BIT&0X01)
{
trade1=float_value()+ float_value();
float_target();
}
else PLC_Addr+=12; //跳过12步程序
}
static void DESUB(void) //浮点减法运算
{
float temp1,temp2;
if(PLC_ACC_BIT&0X01)
{
temp1 = float_value();
temp2 = float_value();
trade1=temp1-temp2;
float_target();
}
else PLC_Addr+=12; //跳过12步程序
}
static void DEDIV(void) //浮点除法运算
{
float temp1,temp2;
if((PLC_ACC_BIT&0X01)==0X01)
{
temp1 = float_value();
temp2 = float_value();
trade1=temp1/temp2;
float_target();
}
else PLC_Addr+=12; //跳过12步程序
}
static void DEMUL(void) //浮点乘法运算
{
if((PLC_ACC_BIT&0X01)==0X01)
{
trade1=float_value()*float_value();
float_target();
}
else PLC_Addr+=12; //跳过12步程序
}
u16 DE[16]={0x0001,0x0003,0x0007,0x000F,0X001F,0X003F,0X007F,0X00FF,0X01FF,0X03FF,0X07FF,0X0FFF,0X1FFF,0X3FFF,0X7FFF,0XFFFF};
void DECO()
{
u8 i,t=1;
int temp1=cos_value(); //读取二进制
int temp2=addr_value();
int n=cos_value(); //解码原件长度
temp1&=DE[n-1]; //解码
for(i=0;i<n;i++) //计算2的n次方
{t*=2;}
// if()
PLC_16BIT[temp2]=1<<(temp1-1);
}
void PLSY(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
GPIO_InitTypeDef GPIO_InitStructure;
static u8 addr;
long sys;
signed short temp,PUS_TOTAL=0;
if(PLC_ACC_BIT&0X01) //判断条件满足否
{
temp=cos_value(); //脉冲频率
PUS_TOTAL=cos_value(); //脉冲计数
addr=*PLC_Addr; //输出地址
PLC_Addr+=2;
if(PLC_16BIT[0x078C] >= PUS_TOTAL)PLC_BIT_ON(M8029);
if((addr==0x00)&&(!(PLC_BIT_TEST(M8145)))&&(Y0P==0)) //Y0
{
PLC_BIT_ON(0x500); //Y00 ON
PLC_BIT_OFF(M8029); //M8029
// PLC_RAM32(0X20005F1C)=0; //D8140
Y0P=1;
Plus_CMP0=PUS_TOTAL;
sys=72000000/((71+1)*(temp*2))-1;
//IO口初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //A7
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);
TIM_DeInit(TIM3);
TIM_TimeBaseStructure.TIM_Period=sys; // 自动重装载寄存器周期的值(计数值)
// 累计 TIM_Period个频率后产生一个更新或者中断
TIM_TimeBaseStructure.TIM_Prescaler= (72 - 1); // 时钟预分频数 72M/72
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; // 采样分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM3, TIM_FLAG_Update); // 清除溢出中断标志
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM3, ENABLE); // 开启时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE); // 先关闭等待使用
PLC_BIT_ON(M8147); // M8147
}
}
else
{
PLC_Addr+=4;
addr=*PLC_Addr; //输出地址
PLC_Addr+=2;
if(addr==0x00) //Y0
{
if(Y0P==1)
{
TIM_Cmd(TIM5, DISABLE);
TIM_Cmd(TIM3, DISABLE);
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
TIM_ITConfig(TIM3, TIM_IT_Update, DISABLE);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //A2
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOC, &GPIO_InitStructure);
Y0P=0;
PLC_BIT_OFF(0x500); //Y00 OFF
PLC_BIT_OFF(M8147); //M8147
}
}
}
}
// static void PWM(void) //ADD 20160619
// {
// u16 temp1,temp2;
// if((PLC_ACC_BIT&0X01)==0X01)
// {
// temp1=2000000/cos_value();
// temp2=2000000/cos_value();
// TIM3->ARR = temp2-1;
// switch(Y_addr())
// {
// case 0x051c: TIM3->CCR1 = temp1-1;PLC_BIT_ON(0X00c0,28);TIM3->CCER=TIM_OutputState_Enable; break; //PWM Y34
// case 0x051d: TIM3->CCR2 = temp1-1;PLC_BIT_ON(0X00c0,29);TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); break; //PWM Y35
// case 0x051e: TIM3->CCR3 = temp1-1;PLC_BIT_ON(0X00c0,30);TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable); break; //PWM Y36
// case 0x051f: TIM3->CCR4 = temp1-1;PLC_BIT_ON(0X00c0,31);TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable); break; //PWM Y37
// }
// }
// else
// {
// PLC_Addr+=4; //跳过4步程序 条件不满足执行跳过程序减小CPU开销
// switch(Y_addr())
// {
// case 0x051c: PLC_BIT_OFF(0X00c0,28); break; //PWM Y34
// case 0x051d: PLC_BIT_OFF(0X00c0,29); break; //PWM Y35
// case 0x051e: PLC_BIT_OFF(0X00c0,30); break; //PWM Y36
// case 0x051f: PLC_BIT_OFF(0X00c0,31); break; //PWM Y37
// }
// }
// }
// void PLSY(void)
// {
// TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// TIM_OCInitTypeDef TIM_OCInitStructure;
// GPIO_InitTypeDef GPIO_InitStructure;
// long div_c;
// signed short temp,PUS_TOTAL=0;
// static u8 Y0P,Y1P,addr;;
// if(PLC_ACC_BIT&0X01) //判断条件满足否
// {
// temp=cos_value(); //脉冲频率
// PUS_TOTAL=cos_value(); //脉冲计数
// addr=*PLC_Addr; //输出地址
// PLC_Addr+=2;
// if((addr==0x00)&&(PLC_BIT_TEST(0x00E0,145))&&(Y0P==0)) //Y0
// {
// PLC_BIT_ON(0XC0,0); //Y00 ON
// PLC_BIT_OFF(0X00E0,29); //M8029
// PLC_RAM32(0X20005E90)=0; //D8140
// Y0P=1;
//
// div_c=75497472/temp;
// div_c=div_c/65536;
// temp=75497472/(temp*(div_c+1));
// temp--;
// //只初始化一次 Y0
// TIM_DeInit(TIM5);
// //TIM5 clock enable PWM MODE
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
// GPIO_Init(GPIOA, &GPIO_InitStructure);
// TIM_TimeBaseStructure.TIM_Period = div_c;
// TIM_TimeBaseStructure.TIM_Prescaler = temp;
// TIM_TimeBaseStructure.TIM_ClockDivision = 0;
// TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
// TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
// // PWM1 Mode configuration: Channel3
// TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
// TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
// TIM_OCInitStructure.TIM_Pulse = temp/2;
// TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
// TIM_OC3Init(TIM5, &TIM_OCInitStructure);
// TIM_OC3PreloadConfig(TIM5, TIM_OCPreload_Enable);
// PLC_16BIT[0x732]=PUS_TOTAL; pus_cnt0=0; pus0=PUS_TOTAL;
// // TIM3 clock source enable ETR MODE
// if(PUS_TOTAL>0)
// {
// if(PUS_TOTAL>1)
// {
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// TIM_TimeBaseStructure.TIM_Period = PUS_TOTAL-1;
// TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
// TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
// TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
// TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // Time base configuration
// TIM_ETRClockMode2Config(TIM3, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);
// TIM_SetCounter(TIM3, 0);
// TIM_ClearFlag(TIM3, TIM_FLAG_Update);
// TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
// TIM_Cmd(TIM3, ENABLE);
// }
// else
// TIM_ITConfig(TIM5, TIM_IT_CC2, ENABLE);//打开中断,中断需要这行代码
// }
// // TIM5 enable counter
// TIM_Cmd(TIM5, ENABLE);
// PLC_BIT_ON(0X00E0,147); //M8147
// }
// if((addr==0x01)&&(PLC_BIT_TEST(0x00E0,146))) //Y1
// {
// PLC_BIT_ON(0XC0,1); //Y01 ON
// PLC_BIT_OFF(0X00E0,29); //M8029
// PLC_RAM32(0X20005E92)=0; //D8140
// Y1P=1;
// div_c=75497472/temp;
// div_c=div_c/65536;
// temp=75497472/(temp*(div_c+1));
// temp--;
// TIM_DeInit(TIM8);
// //PWM MODE
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
// GPIO_Init(GPIOC, &GPIO_InitStructure);
//
// TIM_TimeBaseStructure.TIM_Prescaler = div_c;
// TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
// TIM_TimeBaseStructure.TIM_Period = temp;
// PLC_16BIT[0x734]=PUS_TOTAL;
// TIM_TimeBaseStructure.TIM_ClockDivision = 0;
// TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
// TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
// temp=(temp+1)/2;
// // Channel 1, 2,3 and 4 Configuration in PWM mode
// TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
// TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
// TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
// TIM_OCInitStructure.TIM_Pulse =temp;
// TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
// TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
// TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
// TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
// TIM_OC3Init(TIM8, &TIM_OCInitStructure);
// //TIM1 Main Output Enable
// TIM_CtrlPWMOutputs(TIM8, ENABLE);
// PLC_16BIT[0x734]=PUS_TOTAL; pus_cnt1=0;pus1=PUS_TOTAL;
// if(PUS_TOTAL>0)
// {
// // TIM4 clock source enable ETR MODE
// if(PUS_TOTAL>1)
// {
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
// TIM_TimeBaseStructure.TIM_Period = PUS_TOTAL-1;
// TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
// TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
// TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
// TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); // Time base configuration
// TIM_ETRClockMode2Config(TIM4, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);
// TIM_SetCounter(TIM4, 0);
// TIM_ClearFlag(TIM4, TIM_FLAG_Update);
// TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
// TIM_Cmd(TIM4, ENABLE);
// }
// else
// TIM8->DIER = 0x02; // 使能 CC1 中断
// }
// // TIM1 counter enable
// TIM_Cmd(TIM8, ENABLE);
// PLC_BIT_ON(0X00E0,148); //M8148
// }
// }
// else
// {
// PLC_Addr+=4;
// addr=*PLC_Addr; //输出地址
// PLC_Addr+=2;
// if(addr==0x00) //Y0
// {
// if(Y0P==1)
// {
// TIM_Cmd(TIM5, DISABLE);
// TIM_Cmd(TIM3, DISABLE);
// TIM_ClearFlag(TIM3, TIM_FLAG_Update);
// TIM_ITConfig(TIM3, TIM_IT_Update, DISABLE);
//
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOA, &GPIO_InitStructure);
// // rsty(0);
// Y0P=0;
// PLC_BIT_OFF(0x00C0,0); //Y00 OFF
// PLC_BIT_OFF(0X00E0,147); //M8147
// }
// }
// if(addr==0x01) //Y0
// {
// if(Y1P==1)
// {
// TIM_Cmd(TIM8, DISABLE);
// TIM_Cmd(TIM4, DISABLE);
// TIM_ClearFlag(TIM4, TIM_FLAG_Update);
// TIM_ITConfig(TIM4, TIM_IT_Update, DISABLE);
//
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOC, &GPIO_InitStructure);
//
// // rsty(1);
// Y1P=0;
// PLC_BIT_OFF(0x00C0,1); //Y01 OFF
// PLC_BIT_OFF(0X00E0,148); //M8148
// }
// }
// }
// }
static void Damount(void) //32位等于比较指令
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if(PLC_STL_Status == 1) //为STL状态区
{
PLC_ACC_BIT<<=1;
if((temp1==temp2)&&(PLC_BIT_TEST(PLC_STL_Addr)))
PLC_ACC_BIT|=1;
}
else
{
PLC_ACC_BIT<<=1;
if(temp1==temp2) //当前值判断
PLC_ACC_BIT|=1;
}
}
static void amount(void) //16位等于比较指令
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if(PLC_STL_Status == 1) //为STL状态区
{
PLC_ACC_BIT<<=1;
if((temp1==temp2)&&(PLC_BIT_TEST(PLC_STL_Addr)))
PLC_ACC_BIT|=1;
}
else
{
PLC_ACC_BIT<<=1;
if(temp1==temp2) //当前值判断
PLC_ACC_BIT|=1;
}
}
static void amount_OR()
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if((temp1==temp2)||(PLC_ACC_BIT&0X01)) //当前值判断
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0xFE;
}
static void Damount_OR()
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if((temp1==temp2)||(PLC_ACC_BIT&0X01)) //当前值判断
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0xFE;
}
static void Damount_and(void) //32位AND等于比较
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if((temp1==temp2)&&((PLC_ACC_BIT&0X01)==0X01))
PLC_ACC_BIT|=1;
else
PLC_ACC_BIT&=~1;
}
static void amount_and(void) //16位AND等于比较
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if((temp1==temp2)&&((PLC_ACC_BIT&0X01)==0X01))
PLC_ACC_BIT|=1;
else
PLC_ACC_BIT&=~1;
}
static void Dbig(void) //32位大于比较指令
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if(PLC_STL_Status == 1) //为STL状态区
{
PLC_ACC_BIT<<=1;
if((temp1>temp2)&&(PLC_BIT_TEST(PLC_STL_Addr)))
PLC_ACC_BIT|=1;
}
else
{
PLC_ACC_BIT<<=1;
if(temp1>temp2) //当前值判断 陈凡修改"<"改成了">"
PLC_ACC_BIT|=1;
}
}
static void big(void) //16位大于比较指令
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if(PLC_STL_Status == 1) //为STL状态区
{
PLC_ACC_BIT<<=1;
if((temp1>temp2)&&(PLC_BIT_TEST(PLC_STL_Addr)))
PLC_ACC_BIT|=1;
}
else
{
PLC_ACC_BIT<<=1;
if(temp1>temp2) //当前值判断 陈凡修改"<"改成了">"
PLC_ACC_BIT|=1;
}
}
static void big_OR()
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if((temp1>temp2)||(PLC_ACC_BIT&0X01))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0xFE;
}
static void Dbig_OR()
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if((temp1>=temp2)||(PLC_ACC_BIT&0X01))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0xFE;
}
static void Dbig_and(void) //32位AND大于比较指令
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if((temp1>temp2)&&((PLC_ACC_BIT&0X01)==0X01))
PLC_ACC_BIT|=1;
else
PLC_ACC_BIT&=~1;
}
static void big_and(void) //16位AND大于比较指令
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if((temp1>temp2)&&((PLC_ACC_BIT&0X01)==0X01))
PLC_ACC_BIT|=1;
else
PLC_ACC_BIT&=~1;
}
static void Dless(void) //32位小于比较指令
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if(PLC_STL_Status == 1) //为STL状态区
{
PLC_ACC_BIT<<=1;
if((temp1<temp2)&&(PLC_BIT_TEST(PLC_STL_Addr)))
PLC_ACC_BIT|=1;
}
else
{
PLC_ACC_BIT<<=1;
if(temp1<temp2) //当前值判断
PLC_ACC_BIT|=1;
}
}
static void less(void) //小于比较
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if(PLC_STL_Status == 1) //为STL状态区
{
PLC_ACC_BIT<<=1;
if((temp1<temp2)&&(PLC_BIT_TEST(PLC_STL_Addr)))
PLC_ACC_BIT|=1;
}
else
{
PLC_ACC_BIT<<=1;
if(temp1<temp2) //当前值判断
PLC_ACC_BIT|=1;
}
}
static void less_OR()
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if((temp1<temp2)||(PLC_ACC_BIT&0X01))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0xFE;
}
static void Dless_OR()
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if((temp1<temp2)||(PLC_ACC_BIT&0X01))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0xFE;
}
static void Dless_and(void) //32位AND小于比较
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if((temp1<temp2)&&((PLC_ACC_BIT&0X01)==0X01))
PLC_ACC_BIT|=1;
else
PLC_ACC_BIT&=~1;
}
static void less_and(void) //16位AND小于比较
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if((temp1<temp2)&&((PLC_ACC_BIT&0X01)==0X01))
PLC_ACC_BIT|=1;
else
PLC_ACC_BIT&=~1;
}
static void Dless_amount(void) //32位小于等于比较指令
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if(PLC_STL_Status == 1) //为STL状态区
{
PLC_ACC_BIT<<=1;
if((temp1<=temp2)&&(PLC_BIT_TEST(PLC_STL_Addr)))
PLC_ACC_BIT|=1;
}
else
{
PLC_ACC_BIT<<=1;
if(temp1<=temp2) //当前值判断
PLC_ACC_BIT|=1;
}
}
static void less_amount(void) //16位小于等于比较指令
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if(PLC_STL_Status == 1) //为STL状态区
{
PLC_ACC_BIT<<=1;
if((temp1<=temp2)&&(PLC_BIT_TEST(PLC_STL_Addr)))
PLC_ACC_BIT|=1;
}
else
{
PLC_ACC_BIT<<=1;
if(temp1<=temp2) //当前值判断
PLC_ACC_BIT|=1;
}
}
static void less_amount_OR()
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if((temp1<=temp2)||(PLC_ACC_BIT&0X01))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0xFE;
}
static void Dless_amount_OR()
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if((temp1<=temp2)||(PLC_ACC_BIT&0X01))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0xFE;
}
static void Dless_amount_and(void) //32位AND小于等于比较
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if((temp1<=temp2)&&((PLC_ACC_BIT&0X01)==0X01))
PLC_ACC_BIT|=1;
else
PLC_ACC_BIT&=~1;
}
static void less_amount_and(void) //16位AND小于等于比较
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if((temp1<=temp2)&&(PLC_ACC_BIT&0X01))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0XFE;
}
static void Dbig_amount(void) //32位大于等于比较指令
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if(PLC_STL_Status == 1) //为STL状态区
{
PLC_ACC_BIT<<=1;
if((temp1>=temp2)&&(PLC_BIT_TEST(PLC_STL_Addr)))
PLC_ACC_BIT|=1;
}
else
{
PLC_ACC_BIT<<=1;
if(temp1>=temp2) //当前值判断
PLC_ACC_BIT|=1;
}
}
static void big_amount(void) //16位大于等于比较指令
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if(PLC_STL_Status == 1) //为STL状态区
{
PLC_ACC_BIT<<=1;
if((temp1>=temp2)&&(PLC_BIT_TEST(PLC_STL_Addr)))
PLC_ACC_BIT|=1;
}
else
{
PLC_ACC_BIT<<=1;
if(temp1>=temp2) //当前值判断
PLC_ACC_BIT|=1;
}
}
static void big_amount_OR()
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if((temp1>=temp2)||(PLC_ACC_BIT&0X01))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0xFE;
}
static void Dbig_amount_OR()
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if((temp1>=temp2)||(PLC_ACC_BIT&0X01))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0xFE;
}
static void Dbig_amount_and(void) //32位AND大于等于比较
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if((temp1>=temp2)&&((PLC_ACC_BIT&0X01)==0X01))
PLC_ACC_BIT|=1;
else
PLC_ACC_BIT&=~1;
}
static void big_amount_and(void) //16位AND大于等于比较
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if((temp1>=temp2)&&(PLC_ACC_BIT&0X01))
PLC_ACC_BIT|=1;
else
PLC_ACC_BIT&=~1;
}
static void Dno_amount(void) //32位不等于比较指令
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if(PLC_STL_Status == 1) //为STL状态区
{
PLC_ACC_BIT<<=1;
if((temp1!=temp2)&&(PLC_BIT_TEST(PLC_STL_Addr)))
PLC_ACC_BIT|=1;
}
else
{
PLC_ACC_BIT<<=1;
if(temp1!=temp2) //当前值判断
PLC_ACC_BIT|=1;
}
}
static void no_amount(void) //16位不等于比较指令
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if(PLC_STL_Status == 1) //为STL状态区
{
PLC_ACC_BIT<<=1;
if((temp1!=temp2)&&(PLC_BIT_TEST(PLC_STL_Addr)))
PLC_ACC_BIT|=1;
}
else
{
PLC_ACC_BIT<<=1;
if(temp1!=temp2) //当前值判断
PLC_ACC_BIT|=1;
}
}
static void no_amount_OR()
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if((temp1!=temp2)||(PLC_ACC_BIT&0X01))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0xFE;
}
static void Dno_amount_OR()
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if((temp1!=temp2)||(PLC_ACC_BIT&0X01))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0xFE;
}
static void Dno_amount_and(void) //32位AND不等于比较指令
{
s32 temp1,temp2;
temp1=cos_u32_value();
temp2=cos_u32_value();
if((temp1!=temp2)&&((PLC_ACC_BIT&0X01)==0X01))
PLC_ACC_BIT|=1;
else
PLC_ACC_BIT&=~1;
}
static void no_amount_and(void) //16位AND不等于比较指令
{
signed short int temp1,temp2;
temp1=cos_value();
temp2=cos_value();
if((temp1!=temp2)&&((PLC_ACC_BIT&0X01)==0X01))
PLC_ACC_BIT|=1;
else
PLC_ACC_BIT&=~1;
}
static void LDP(void) //LDP
{
if(PLC_PL_BIT_TEST(PLC_Addr-PLC_START_Address))
{
PLC_ACC_BIT<<=1;
if(!(PLC_LD_BIT(0X2fff&*PLC_Addr))) //当前值判断
PLC_PL_BIT_OFF(PLC_Addr-PLC_START_Address);
}
else //上升沿判断
{
if(PLC_STL_Status == 1) //为STL状态区
{
PLC_ACC_BIT<<=1;
if((PLC_LD_BIT(0X2fff&*PLC_Addr))&&(PLC_BIT_TEST(PLC_STL_Addr))) //当前值判断
PLC_ACC_BIT|=0x01,PLC_PL_BIT_ON(PLC_Addr-PLC_START_Address); //
}
else
{
PLC_ACC_BIT<<=1;
if(PLC_LD_BIT(0X2fff&*PLC_Addr)) //当前值判断
PLC_ACC_BIT|=0x01,PLC_PL_BIT_ON(PLC_Addr-PLC_START_Address); //
}
}
PLC_Addr++;
}
static void LDF(void) //LDF
{
if(PLC_PL_BIT_TEST(PLC_Addr-PLC_START_Address)) //上升沿判断
{
if(PLC_STL_Status == 1) //为STL状态区
{
PLC_ACC_BIT<<=1;
if((!(PLC_LD_BIT(0X2fff&*PLC_Addr)))&&(PLC_BIT_TEST(PLC_STL_Addr)))//当前值判断
PLC_ACC_BIT|=0x01,PLC_PL_BIT_ON(PLC_Addr-PLC_START_Address);
}
else
{
PLC_ACC_BIT<<=1;
if(!(PLC_LD_BIT(0X2fff&*PLC_Addr))) //当前值判断
PLC_ACC_BIT|=1,PLC_PL_BIT_OFF(PLC_Addr-PLC_START_Address);//
}
}
else
{
PLC_ACC_BIT<<=1,PLC_ACC_BIT&=0XFE; //清除输出标准开关
if(PLC_LD_BIT(0X2fff&*PLC_Addr)) //当前值判断
PLC_PL_BIT_ON(PLC_Addr-PLC_START_Address);//
}
PLC_Addr++;
}
static void ANDP(void) //ANDP
{
u8 logic;
if(PLC_PL_BIT_TEST(PLC_Addr-PLC_START_Address)) //查出当前步号对应的逻辑值
{
logic=0;
if(!(PLC_LD_BIT(0X2fff&*PLC_Addr))) //当前值判断
PLC_PL_BIT_OFF(PLC_Addr-PLC_START_Address); //
}
else //上升沿判断
{
if(PLC_LD_BIT(0X2fff&*PLC_Addr)) //当前值判断
logic=1,PLC_PL_BIT_ON(PLC_Addr-PLC_START_Address); //上升沿成立
else
logic=0; //上升沿不成立
}
if((PLC_ACC_BIT&0x01)&&(logic==1))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0XFE;
PLC_Addr++;
}
static void ANDF(void) //ANDF
{
u8 logic;
if(PLC_PL_BIT_TEST(PLC_Addr-PLC_START_Address)) //上升沿判断
{
if(!(PLC_LD_BIT(0X2fff&*PLC_Addr))) //当前值判断
logic=1,PLC_PL_BIT_OFF(PLC_Addr-PLC_START_Address); //
else
logic=0; //
}
else
{
logic=0;
if(PLC_LD_BIT(0X2fff&*PLC_Addr)) //当前值判断
PLC_PL_BIT_ON(PLC_Addr-PLC_START_Address); //
}
if((PLC_ACC_BIT&0x01)&&(logic==1))
PLC_ACC_BIT|=0X01;
else
PLC_ACC_BIT&=0XFE;
PLC_Addr++;
}
static void ORP(void) //ORP
{
u8 logic;
if(PLC_PL_BIT_TEST(PLC_Addr-PLC_START_Address))
{
logic=0; //
if(!(PLC_LD_BIT(0X2fff&*PLC_Addr))) //当前值判断
PLC_PL_BIT_OFF(PLC_Addr-PLC_START_Address); //
}
else //上升沿判断
{
if(PLC_LD_BIT(0X2fff&*PLC_Addr)) //当前值判断
logic=1,PLC_PL_BIT_ON(PLC_Addr-PLC_START_Address); //
else
logic=0; //
}
if(((PLC_ACC_BIT&0x01)==0x01)||(logic==1))
PLC_ACC_BIT|=0x01;
else
PLC_ACC_BIT&=0XFE;
PLC_Addr++;
}
static void ORF(void) //ORF
{
u8 logic;
if(PLC_PL_BIT_TEST(PLC_Addr-PLC_START_Address)) //上升沿判断
{
if(!(PLC_LD_BIT(0X2fff&*PLC_Addr))) //当前值判断
logic=1,PLC_PL_BIT_OFF(PLC_Addr-PLC_START_Address);//
else
logic=0; //
}
else
{
logic=0;
if(PLC_LD_BIT(0X2fff&*PLC_Addr)) //当前值判断
PLC_PL_BIT_ON(PLC_Addr-PLC_START_Address); //
}
if(((PLC_ACC_BIT&0x01)==0x01)||(logic==1))
PLC_ACC_BIT|=1;
else
PLC_ACC_BIT&=~1;
PLC_Addr++;
}
static void CJ_EX(u8 value) //执行跳指令
{
PLC_Addr++;
if((*PLC_Addr&0xff00)==0x8000)
{PLC_Addr=PLC_P_Addr[value/2],PLC_Addr++;}//取低位
}
static void CJ(void)
{
if(PLC_ACC_BIT&0X01)
{
if((*PLC_Addr&0xff00)==0x8800) CJ_EX(*PLC_Addr);
}
else PLC_Addr+=2;
}
static void CJP(void) //CJP
{
if(PLC_LDP_TEST()) //上升沿判断
{if((*PLC_Addr&0xff00)==0x8800) CJ_EX(*PLC_Addr);}
else
PLC_Addr+=2; //条件不满足执行跳过程序减小CPU开销
}
static void SRET(void)
{
u8 temp;
PLC_ACC_BIT=process[0]; //返回上一个逻辑状态值
PLC_Addr=p_save[0]; //返回上一个子程序前的执行地址
for(temp=62;temp>0;temp--)
{
process[temp]=process[temp+1]; //data mov down
p_save[temp]=p_save[temp+1];
}
}
static void P_MOV(void)
{
u8 temp;
for(temp=62;temp>0;temp--)
{
process[temp+1]=process[temp]; //数据 MOV up
p_save[temp+1]=p_save[temp];
}
process[0]=PLC_ACC_BIT; //保存上一个逻辑状态值
p_save[0]=PLC_Addr; //保存上一个子程序前的执行地址
}
static void CALL_EX(u8 value)
{
PLC_Addr++;
if((*PLC_Addr&0xff00)==0x8000)
{P_MOV(),PLC_Addr=PLC_P_Addr[value/2];}// 先压入状态寄存器以及前一个P指针的地址
}
static void CALL(void)
{
if(PLC_ACC_BIT&0X01)
{
if((*PLC_Addr&0xff00)==0x8800)
{CALL_EX(*PLC_Addr);}
}
else PLC_Addr+=2;
}
static void CALLP(void) //CALLP
{
if(PLC_LDP_TEST()) //上升沿判断
{if((*PLC_Addr&0xff00)==0x8800)CALL_EX(*PLC_Addr);}
else
PLC_Addr+=2; //条件不满足执行跳过程序减小CPU开销
}
void expand_SET(void)
{
BIT_SET(0X2FFF&*PLC_Addr);PLC_Addr++;
}
void expand_RST(void)
{
RST(0X2FFF&*PLC_Addr);PLC_Addr++;
}
void expand_OUT(void)
{
OUT(0X2FFF&*PLC_Addr);PLC_Addr++;
}
void expand_LD(void)
{
LD(0X2FFF&*PLC_Addr);PLC_Addr++;
}
void expand_LDI(void)
{
LDI(0x2FFF&*PLC_Addr);PLC_Addr++;
}
void expand_AND(void)
{
AND(0x2FFF&*PLC_Addr);PLC_Addr++;
}
void expand_ANI(void)
{
ANI(0x2FFF&*PLC_Addr);PLC_Addr++;
}
void expand_OR(void)
{
OR(0x2FFF&*PLC_Addr);PLC_Addr++;
}
void expand_ORI(void)
{
ORI(0x2FFF&*PLC_Addr);PLC_Addr++;
}
static void enable_T_K(void)
{
static u16 *p_data;
T_value=*PLC_Addr%0x100; //赋低8位值
PLC_Addr++;
T_value+=(*PLC_Addr%0x100)*0x100; //赋高8位值
p_data=PLC_16BIT+0x0900+T_number; //指针指向T比较的值地址
*p_data=T_value; //赋值给地址
timer_enable(T_number);
OUT(0X1600+(u8)T_number);
}
static void enable_T_D(void)
{
PLC_16BIT[0x0900+T_number]=PLC_16BIT[0x1000+T_value];
timer_enable(T_number);
OUT(0X1600+(u8)T_number);
}
static void disable_T(void)
{
timer_disble(T_number);
OUT(0X1600+(u8)T_number); //disable T coil
OUT(0x0600+(u8)T_number); //reset T over coil
}
static void T_given_value_K(void) //
{
if(PLC_ACC_BIT&0X01) //
enable_T_K();
else
PLC_Addr++,disable_T();
}
static void T_given_value_D(void) //
{
T_value=(*PLC_Addr%0x100)/2;
PLC_Addr++;
switch(*PLC_Addr/0x100)
{
case 0x86: T_value+=(*PLC_Addr%0x100)*0x80; break;
case 0x88: T_value+=(*PLC_Addr%0x100)*0x80+1000; break;
}
if((PLC_ACC_BIT&0X01)==0X01) //是否有效
enable_T_D();
else
disable_T();
}
static void operation_T(void)
{
T_number=*PLC_Addr; //将操作定时器的号码送入
PLC_Addr++; //下一个功能取是K赋值还是D赋值
switch(*PLC_Addr/0x100)
{
case 0x80: T_given_value_K(); break; //进行K赋值操作
case 0x86: T_given_value_D(); break; //进行D赋值操作
}
}
static void enable_C_K(void) //用常数K进行赋值
{
u16 temp_bit,*p_C_enable_coil;u32 C;
C_value=*PLC_Addr%0x100; //赋低8位值
PLC_Addr++;
C_value+=(*PLC_Addr%0x100)*0x100; //赋高8位值
if(C_number>=0xC8) //判断是不是C200以上的 寄存器
{
PLC_Addr++;
C_value+=(*PLC_Addr%0x100)*0x10000; //赋低8位值
PLC_Addr++;
C_value+=(*PLC_Addr%0x100)*0x1000000;//赋高8位值
C=0x20001C00+(C_number-0xC8)*4;
temp_bit=1<<(C_number%0x10);
if(PLC_RAM32(C)<C_value) //把C当前值与目标值进行比较
{
p_C_enable_coil=PLC_16BIT+0x0270+(C_number/0X10);//比较enable coil
if(!((*p_C_enable_coil&temp_bit)==temp_bit))
PLC_RAM32(C)+=1;
}
if(PLC_RAM32(C)<C_value) //比较溢出值
PLC_BIT_OFF(0x0E00+C_number);
else
PLC_BIT_ON(0x0E00+C_number);
}
else
{
static u16 *p_data;
p_data=PLC_16BIT+0x0500+C_number; //
temp_bit=1<<(C_number%0x10);
if(*p_data<C_value)
{
p_C_enable_coil=PLC_16BIT+0x0270+(C_number/0X10); //比较enable coil
if(!((*p_C_enable_coil&temp_bit)==temp_bit))
*p_data+=1;
}
if(*p_data<C_value) //比较溢出值
PLC_BIT_OFF(0x0E00+C_number);
else
PLC_BIT_ON(0x0E00+C_number);
}
OUT(0X2700+(u8)C_number);
}
static void enable_C_D(void) //用寄存器D进行赋值
{
static u16 *p_data;
u16 temp_bit,*p_C_enable_coil;u32 C;
C_value=PLC_16BIT[0x1000+C_value];
if(C_number>=0xC8) //判断是不是C200以上的 寄存器
{
C_value+=PLC_16BIT[0x1000+C_value+1]*0x10000;
C=0x20001C00+(C_number-0xC8)*4;
temp_bit=1<<(C_number%0x10);
if(PLC_RAM32(C)<C_value) //把C当前值与目标值进行比较
{
p_C_enable_coil=PLC_16BIT+0x0270+(C_number/0X10); //比较enable coil
if(!((*p_C_enable_coil&temp_bit)==temp_bit))
PLC_RAM32(C)+=1;
}
if(*p_data<C_value) //比较溢出值
PLC_BIT_OFF(0x0E00+C_number);
else
PLC_BIT_ON(0x0E00+C_number);
PLC_Addr+=2;
}
else
{
p_data=PLC_16BIT+0x0500+C_number;
temp_bit=1<<(C_number%0x10);
if(*p_data<C_value) //把C当前值与目标值进行比较
{
p_C_enable_coil=PLC_16BIT+0x0270+(C_number/0X10); //比较enable coil
if(!((*p_C_enable_coil&temp_bit)==temp_bit))
*p_data+=1;
}
if(*p_data<=C_value) //比较溢出值
PLC_BIT_OFF(0x0E00+C_number);
else
PLC_BIT_ON(0x0E00+C_number);
}
OUT(0X2700+(u8)C_number);
}
static void disable_C_K(void)
{
u32 C;static u16 *p_data;
C_value=*PLC_Addr%0x100; //赋低8位值
PLC_Addr++;
C_value+=(*PLC_Addr%0x100)*0x100; //赋高8位值
if(C_number>=0xC8) //判断是不是C200以上的 寄存器
{
PLC_Addr++;
C_value=(*PLC_Addr%0x100)*0x10000; //赋低8位值
PLC_Addr++;
C_value+=(*PLC_Addr%0x100)*0x1000000;//赋高8位值
C=0x20001C00+(C_number-0xC8)*4;
if(PLC_RAM32(C)<C_value) //把C当前值与目标值进行比较
PLC_BIT_OFF(0x0E00+C_number);
else
PLC_BIT_ON(0x0E00+C_number);
}
else
{
p_data=PLC_16BIT+0x0500+C_number;
if(*p_data<C_value) //比较溢出值
PLC_BIT_OFF(0x0E00+C_number);
else
PLC_BIT_ON(0x0E00+C_number);
}
OUT(0X2700+(u8)C_number);
}
static void disable_C_D(void) //关闭计数器C
{
u32 C;static u16 *p_data;
if(C_number>=0xC8) //判断是不是C200以上的 寄存器
{
C_value=PLC_16BIT[0x1000+C_value];
C_value+=PLC_16BIT[0x1000+C_value+1]*0x10000;
C=0x20001C00+(C_number-0xC8)*4;
if(PLC_RAM32(C)<C_value) //比较溢出值
PLC_BIT_OFF(0x0E00+C_number);
else
PLC_BIT_ON(0x0E00+C_number);
PLC_Addr+=2;
}
else
{
C_value=PLC_16BIT[0x1000+C_value];
p_data=PLC_16BIT+0x0500+C_number;
if(*p_data<C_value) //比较溢出值
PLC_BIT_OFF(0x0E00+C_number);
else
PLC_BIT_ON(0x0E00+C_number);
}
OUT(0X2700+(u8)C_number);
}
static void C_given_value_K(void) //程序中以K来设定值
{
if((PLC_ACC_BIT&0X01)==0X01) //
enable_C_K(); //开启计数器
else
disable_C_K();
}
static void C_given_value_D(void) //程序中以D来设定值
{
C_value=(*PLC_Addr%0x100)/2;
PLC_Addr++;
switch(*PLC_Addr/0x100)
{
case 0x86: C_value+=(*PLC_Addr%0x100)*0x80; break;
case 0x88: C_value+=(*PLC_Addr%0x100)*0x80+1000; break;
}
if(PLC_ACC_BIT&0X01) //
enable_C_D();
else
disable_C_D();
}
static void operation_C()
{
C_number=*PLC_Addr; //将操作计数器的号码送入
PLC_Addr++; //下一个功能取是K赋值还是D赋值
switch(*PLC_Addr/0x100)
{
case 0x80: C_given_value_K();break; //进行K赋值操作
case 0x86: C_given_value_D();break; //进行D赋值操作
}
}
static void FNC_AppInstruct(void)
{
switch(*PLC_Addr)
{
case 0x0002: PLC_Addr++,expand_OUT(); break; //M1535以上的指令
case 0x0003: PLC_Addr++,expand_SET(); break; //M1535以上的指令
case 0x0004: PLC_Addr++,expand_RST(); break; //M1535以上的指令
case 0x0005: PLC_Addr++,expand_OUT(); break; //
case 0x0006: PLC_Addr++,expand_SET(); break; //
case 0x0007: PLC_Addr++,expand_RST(); break; //
case 0x0008: PLC_Addr++,LPS(); break; //
case 0x0009: PLC_Addr++,LPF(); break; //
case 0x000C: PLC_Addr++,RST_T_C(); break; //执行RST C&T
case 0x000D: PLC_Addr++,RST_D(); break; //执行D寄存器复位
case 0x0010: PLC_Addr++,CJ(); break; //CJ
case 0x1010: PLC_Addr++,CJP(); break; //CJP
case 0x0012: PLC_Addr++,CALL(); break; //CALL
case 0x1012: PLC_Addr++,CALLP(); break; //CALLP
case 0x0014: PLC_Addr++,SRET(); break; //SRET
case 0x001C: PLC_Addr=PLC_Addr; break; //FEND
// case 0X0020: PLC_Addr++,FOR(); break; //小小晟 20160929新增FOR循环
// case 0X0022: PLC_Addr++,FOR_NEXT(); break; //小小晟 20160929新增FOR_NEST 循环结束
case 0X0024: PLC_Addr++,CMP(); break; //16位比较传送指令
case 0X1024: PLC_Addr++,CMPP(); break; //16位上升沿比较传送指令
case 0X0025: PLC_Addr++,DCMP(); break; //32位比较传送指令
case 0X1025: PLC_Addr++,DCMPP(); break; //32位上升沿比较传送指令
case 0X0026: PLC_Addr++,ZCP(); break; //16位区间值比较传送指令
case 0X0027: PLC_Addr++,DZCP(); break; //32位区间值比较传送指令
case 0x0028: PLC_Addr++,MOV(); break; //执行16bit传送指令
case 0X0029: PLC_Addr++,DMOV(); break; //DMOV
case 0X002A: PLC_Addr++,SMOV(); break; //SMOV
case 0X002C: PLC_Addr++,CML(); break; //CML取反指令
case 0X002D: PLC_Addr++,DCML(); break; //DCML取反指令
case 0X002E: PLC_Addr++,BMOV(); break; //成批传送
case 0X0030: PLC_Addr++,FMOV(); break; //多点传送
case 0X0031: PLC_Addr++,DFMOV(); break; //32位多点传送
case 0X0032: PLC_Addr++,XCH(); break; //交换传送
case 0X0033: PLC_Addr++,DXCH(); break; //32位交换传送
case 0X0034: PLC_Addr++,BCD(); break; //二进制转换BCD
case 0X0035: PLC_Addr++,DBCD(); break; //二进制转换DBCD
case 0X0036: PLC_Addr++,BIN(); break; //二进制转换BIN
case 0X0037: PLC_Addr++,DBIN(); break; //二进制转换DBIN
case 0X0038: PLC_Addr++,ADD(); break; //加法指令
case 0x0039: PLC_Addr++,DADD(); break; //DADD加法运算
case 0X003A: PLC_Addr++,SUB(); break; //减法指令
case 0x003B: PLC_Addr++,DSUB(); break; //DSUB减法运算
case 0x003C: PLC_Addr++,MUL(); break; //MUL 乘法指令
case 0x003D: PLC_Addr++,DMUL(); break; //DMUL乘法运算
case 0x003E: PLC_Addr++,DIV(); break; //DIV 乘法指令
case 0x003F: PLC_Addr++,DDIV(); break; //DDIV除法运算
case 0x0040: PLC_Addr++,INC(); break; //16位逻辑运算加1指令
case 0x1040: PLC_Addr++,INCP(); break; //16位上升沿逻辑运算加1指令
case 0x0041: PLC_Addr++,DINC(); break; //32位逻辑运算加1指令
case 0x1041: PLC_Addr++,DINC_P(); break; //32位上升沿逻辑运算加1指令
case 0x0042: PLC_Addr++,DEC(); break; //16位逻辑运算减1指令
case 0x1042: PLC_Addr++,DECP(); break; //16位上升沿逻辑运算减1指令
case 0x0043: PLC_Addr++,DDEC(); break; //32位逻辑运算减1指令
case 0x0044: PLC_Addr++,WAND(); break; //逻辑运算与逻辑
case 0x0045: PLC_Addr++,DWAND(); break; //32位逻辑运算与逻辑
case 0x0046: PLC_Addr++,WOR(); break; //逻辑运算或逻辑
case 0x0047: PLC_Addr++,DWOR(); break; //32位逻辑运算或逻辑
case 0x0048: PLC_Addr++,WXOR(); break; //逻辑运算异或逻辑
case 0x0049: PLC_Addr++,DWXOR(); break; //32位逻辑运算异或逻辑
case 0x004A: PLC_Addr++,NEG(); break; //逻辑运算取负数
case 0x004B: PLC_Addr++,DNEG(); break; //32位逻辑运算取负数
case 0x004C: PLC_Addr++,ROR(); break; //ROR
case 0x004D: PLC_Addr++,DROR(); break; //DROR
case 0x004E: PLC_Addr++,ROL(); break; //ROL
case 0x004F: PLC_Addr++,DROL(); break; //DROL
case 0x0050: PLC_Addr++,RCR(); break; //RCR
case 0x0051: PLC_Addr++,DRCR(); break; //DRCR
case 0x0052: PLC_Addr++,RCL(); break; //RCL
case 0x0053: PLC_Addr++,DRCL(); break; //DRCL
// case 0x0054: PLC_Addr++,SFTR(); break; //SFTR
case 0x0060: PLC_Addr++,ZRST(); break;
case 0x0062: PLC_Addr++,DECO(); break; //整数转浮点
case 0x006A: PLC_Addr++,MEAN(); break; //MEAN求平均值指令
case 0x0070: PLC_Addr++,SQR(); break; //SQR16位整数开方
case 0x0071: PLC_Addr++,DSQR(); break; //SQR32位整数开方
case 0x0072: PLC_Addr++,FLT(); break; //16位整数转浮点
case 0x0073: PLC_Addr++,DFLT(); break; //32位整数转浮点
case 0x0076: PLC_Addr++,REFF(); break; //REFF
case 0x0078: PLC_Addr++,MTR(); break; //MTR
case 0x007A: PLC_Addr++,HSCS(); break; //高速计数置位 20160709
// case 0x0084: PLC_Addr++,PWM(); break; //PWM输出
case 0x0082: PLC_Addr++,PLSY(); break; //高速脉冲输出
case 0x0094: PLC_Addr++,ALT(); break; //ALT
// case 0x00B4: PLC_Addr++,ASCI(); break; //ASCI
case 0x00C0: PLC_Addr++,PID(); break; //PID
case 0x00ED: PLC_Addr++,ECMP(); break; //ECMP
case 0x00EE: PLC_Addr++,EZCP(); break; //EZCP
case 0x00F1: PLC_Addr++,DEMOV(); break; //
// case 0x00FD: PLC_Addr++,DEBCD(); break; //DEBCD
case 0x0101: PLC_Addr++,DEADD(); break; //浮点加法运算
case 0x0103: PLC_Addr++,DESUB(); break; //浮点减法运算
case 0x0107: PLC_Addr++,DEDIV(); break; //浮点乘法运算
case 0x0105: PLC_Addr++,DEMUL(); break; //浮点除法运算
case 0x010F: PLC_Addr++,DESQR(); break; //DESQR浮点开方
case 0x0112: PLC_Addr++,INT(); break; //INT
case 0x0113: PLC_Addr++,DINT(); break; //DINT
case 0x0115: PLC_Addr++,DSIN(); break; //DSIN
case 0x0117: PLC_Addr++,DCOS(); break; //DCOS
case 0x0119: PLC_Addr++,DTAN(); break; //DTAN
case 0x0136: PLC_Addr++,SWAP(); break; //SWAP
case 0x0137: PLC_Addr++,DSWAP(); break; //DSWAP
case 0x0150: PLC_Addr++,TCMP(); break; //TCMP
case 0x0152: PLC_Addr++,TZCP(); break; //TZCP
case 0x0154: PLC_Addr++,TADD(); break; //TADD
case 0x0156: PLC_Addr++,TSUB(); break; //TSUB
case 0x015C: PLC_Addr++,TRD(); break; //TRD
case 0x015E: PLC_Addr++,TWR(); break; //TWR
case 0x0164: PLC_Addr++,GRY(); break; //GRY
case 0x0165: PLC_Addr++,DGRY(); break; //DGRY
case 0x0166: PLC_Addr++,GBIN(); break; //GBIN
case 0x0167: PLC_Addr++,DGBIN(); break; //DGBIN
case 0x01C2: PLC_Addr++,expand_LD(); break; //M1535以上的指令
case 0x01C3: PLC_Addr++,expand_LDI(); break; //
case 0x01C4: PLC_Addr++,expand_AND(); break; //
case 0x01C5: PLC_Addr++,expand_ANI(); break; //
case 0x01C6: PLC_Addr++,expand_OR(); break; //
case 0x01C7: PLC_Addr++,expand_ORI(); break; //
case 0x01CA: PLC_Addr++,LDP(); break; //上升延处理程序
case 0x01CB: PLC_Addr++,LDF(); break; //上升延处理程序
case 0x01CC: PLC_Addr++,ANDP(); break; //上升延处理程序
case 0x01CD: PLC_Addr++,ANDF(); break; //上升延处理程序
case 0x01CE: PLC_Addr++,ORP(); break; //上升延处理程序
case 0x01CF: PLC_Addr++,ORF(); break; //上升延处理程序
case 0X01D0: PLC_Addr++,amount(); break; //LD 16位等于比较
case 0X01D1: PLC_Addr++,Damount(); break; //LD 32位等于比较
case 0X01D2: PLC_Addr++,big(); break; //LD 16位大于比较
case 0X01D3: PLC_Addr++,Dbig(); break; //LD 32位大于比较
case 0X01D4: PLC_Addr++,less(); break; //LD 16位小于比较
case 0X01D5: PLC_Addr++,Dless(); break; //LD 32位小于比较
case 0X01D8: PLC_Addr++,no_amount(); break; //LD 16位不等于比较指令
case 0X01D9: PLC_Addr++,Dno_amount(); break; //LD 32位不等于比较指令
case 0X01DA: PLC_Addr++,less_amount(); break; //LD 16位小于等于比较
case 0X01DB: PLC_Addr++,Dless_amount(); break; //LD 32位小于等于比较
case 0X01DC: PLC_Addr++,big_amount(); break; //LD 16位大于等于比较
case 0X01DD: PLC_Addr++,Dbig_amount(); break; //LD 32位大于等于比较
case 0X01E0: PLC_Addr++,amount_and(); break; //LD AND 16位等于比较
case 0X01E1: PLC_Addr++,Damount_and(); break; //LD AND 32位等于比较
case 0X01E2: PLC_Addr++,big_and(); break; //LD AND 16位大于比较
case 0X01E3: PLC_Addr++,Dbig_and(); break; //LD AND 32位大于比较
case 0X01E4: PLC_Addr++,less_and(); break; //LD AND 16位小于比较
case 0X01E5: PLC_Addr++,Dless_and(); break; //LD AND 32位小于比较
case 0X01E8: PLC_Addr++,no_amount_and(); break; //LD 16位不等于比较指令
case 0X01E9: PLC_Addr++,Dno_amount_and(); break; //LD 32位不等于比较指令
case 0X01EA: PLC_Addr++,less_amount_and(); break; //LD AND 16位小于等于比较
case 0X01EB: PLC_Addr++,Dless_amount_and(); break; //LD AND 32位小于等于比较
case 0X01EC: PLC_Addr++,big_amount_and(); break; //LD AND 16位大于等于比较
case 0X01ED: PLC_Addr++,Dbig_amount_and(); break; //LD AND 32位大于等于比较
case 0X01F0: PLC_Addr++,amount_OR(); break; //LD OR 16位等于比较
case 0X01F1: PLC_Addr++,Damount_OR(); break; //LD OR 32位等于比较
case 0X01F2: PLC_Addr++,big_OR(); break; //LD OR 16位大于比较
case 0X01F3: PLC_Addr++,Dbig_OR(); break; //LD OR 32位大于比较
case 0X01F4: PLC_Addr++,less_OR(); break; //LD OR 16位小于比较
case 0X01F5: PLC_Addr++,Dless_OR(); break; //LD OR 32位小于比较
case 0X01F8: PLC_Addr++,no_amount_OR(); break; //LD 16位不等于比较指令
case 0X01F9: PLC_Addr++,Dno_amount_OR(); break; //LD 32位不等于比较指令
case 0X01FA: PLC_Addr++,less_amount_OR(); break; //LD OR 16位小于等于比较
case 0X01FB: PLC_Addr++,Dless_amount_OR(); break; //LD OR 32位小于等于比较
case 0X01FC: PLC_Addr++,big_amount_OR(); break; //LD OR 16位大于等于比较
case 0X01FD: PLC_Addr++,Dbig_amount_OR(); break; //LD OR 32位大于等于比较
case 0x000F: PLC_Addr=PLC_Addr; break; //如果遇到END指令则使后面结束
case 0XF7FF: PLC_Addr++,RET(); break; //RET
default:PLC_PROG_ERROR(M8065,02); PLC_Addr++; break; //遇到不支持的命令
}
}
void find_p(void)//查找 P 所在的地址
{
u16 temp;
PLC_Addr=PLC_START_Address;
for(temp=0;temp<15999;temp++)//总共16000步
{
if((*PLC_Addr&0xFF00)==0xB000)
PLC_P_Addr[*PLC_Addr%0x100]=PLC_Addr;
PLC_Addr++;
}
}
void RST_Y(void)
{PLC_16BIT[80]=PLC_16BIT[81]=0;}
u16 find_toend(void)//查找 P 所在的地址
{
u16 temp;
PLC_Addr=PLC_START_Address-1;
temp=0;
do{PLC_Addr++; temp++;}
while((!(*PLC_Addr==0x000f))&&(temp<15998));
return temp;
}
// 小小晟20160929优化
void PLC_ProInstructParse(void)
{
static u8 puls,run_flag;
if(PLC_RUN) //是否需要运行程序
{
if(run_flag == 1)
{
run_flag = 0;
PLC_8BIT(0X01E0)=0x09;
}
if(PLC_8BIT(0X01E0)==0x09) //是否需要运行程序
{
PLC_BIT_ON(M8000); //运行强制M80000为ON
PLC_BIT_OFF(M8001); //运行强制M80001为off
run_Lamp; //亮起运行灯
if(edit_prog==0x00) //判断是否存在程序编辑如果编辑一次程序后必需重新计算P所在的址
{
find_p();
edit_prog=1;
if(find_toend()>15998)
{
PLC_8BIT(0X01E0)=0x09;
goto all_end;
}
}
if(puls==0x00) //初始化脉冲用到8002 8003
{
PLC_BIT_ON(M8002);
PLC_BIT_OFF(M8003);
}
PLC_Addr=PLC_START_Address; //PLC到起始地址
if(Write_Pro_flag == 0)
{
PLC_IO_Refresh(); //刷新Y输出
}
do
{
switch(*PLC_Addr/0x100) // 取高8位的数据
{
case 0x06: operation_T(),PLC_Addr++; break; //operation all timer
case 0x0E: operation_C(),PLC_Addr++; break; //
/* 操作S位元件所有的函数 */
case 0x20: LD(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x30: LDI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x40: AND(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x50: ANI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x60: OR(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x70: ORI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
/* 操作S位元件所有的函数 */
case 0x21: LD(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x31: LDI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x41: AND(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x51: ANI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x61: OR(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x71: ORI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
/* 操作S位元件所有的函数 */
case 0x22: LD(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x32: LDI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x42: AND(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x52: ANI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x62: OR(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x72: ORI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
/* 操作S位元件所有的函数 */
case 0x23: LD(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x33: LDI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x43: AND(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x53: ANI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x63: OR(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x73: ORI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
/* 操作X位元件所有的函数 */
case 0x24: LD(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x34: LDI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x44: AND(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x54: ANI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x64: OR(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x74: ORI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
/* 操作Y位元件所有的函数 */
case 0x25: LD(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x35: LDI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x45: AND(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x55: ANI(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x65: OR(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x75: ORI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XC5: OUT(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XD5: BIT_SET(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XE5: RST(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
/* 操作T位元件所有的函数 */
case 0x26: LD(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x36: LDI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x46: AND(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x56: ANI(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x66: OR(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x76: ORI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XC6: OUT(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
/* 操作T位元件所有的函数 */
case 0x27: LD(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x37: LDI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x47: AND(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x57: ANI(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x67: OR(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x77: ORI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XC7: OUT(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
/* 操作M0_255位元件所有的函数 */
case 0x28: LD(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x38: LDI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x48: AND(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x58: ANI(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x68: OR(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x78: ORI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XC8: OUT(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XD8: BIT_SET(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XE8: RST(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
/* 操作M256_511位元件所有的函数 */
case 0x29: LD(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x39: LDI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x49: AND(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x59: ANI(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x69: OR(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x79: ORI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XC9: OUT(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XD9: BIT_SET(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XE9: RST(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
/* 操作M512_767位元件所有的函数 */
case 0x2A: LD(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x3A: LDI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x4A: AND(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x5A: ANI(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x6A: OR(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x7A: ORI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XCA: OUT(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XDA: BIT_SET(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XEA: RST(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
/* 操作M768_1023位元件所有的函数 */
case 0x2B: LD(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x3B: LDI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x4B: AND(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x5B: ANI(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x6B: OR(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x7B: ORI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XCB: OUT(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XDB: BIT_SET(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XEB: RST(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
/* 操作M1024_1279位元件所有的函数 */
case 0x2C: LD(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x3C: LDI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x4C: AND(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x5C: ANI(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x6C: OR(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x7C: ORI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XCC: OUT(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XDC: BIT_SET(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XEC: RST(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
/* 操作M1280_1535位元件所有的函数 */
case 0x2D: LD(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x3D: LDI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x4D: AND(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x5D: ANI(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x6D: OR(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x7D: ORI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XCD: OUT(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XDD: BIT_SET(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XED: RST(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
/* 操作C0-C255位元件所有的函数 */
case 0x2E: LD(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x3E: LDI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x4E: AND(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x5E: ANI(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x6E: OR(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x7E: ORI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
/*m8000-m8255*/
case 0x2F: LD(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x3F: LDI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x4F: AND(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x5F: ANI(0X0FFF&*PLC_Addr),PLC_Addr++; break;
case 0x6F: OR(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0x7F: ORI(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XCF: OUT(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XDF: BIT_SET(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0XEF: RST(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
/**********************STL步进模式***************************/
case 0xF0: STL(0X0FFF&*PLC_Addr),PLC_Addr++; break; //S
case 0xF1: STL(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0xF2: STL(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
case 0xF3: STL(0X0FFF&*PLC_Addr),PLC_Addr++; break; //
////////////////////////////////////////////////////////
//基本逻辑指令二如ANB、ORB、MPP、MRD、MPS、INV 等
case 0XFF:
{
other_function(*PLC_Addr);
PLC_Addr++;
break; //MPP,MPS
}
case 0xB0: //指针P标识
{
PLC_Addr++;
break;
}
case 0x00: //遇到0X001C为FEND,0X000F为END指令
{
if(((*PLC_Addr%0x100)==0x1C)||((*PLC_Addr%0x100)==0x0F))
goto all_end;
}
//////////////////////////////////////////////////////////////
// 小小晟20160929注释应用指令
//////////////////////////////////////////////////////////////
default: //遇到不支持的命令 ,此处需要执行命令为16bit的指令
{
FNC_AppInstruct();
break;
}
}
}while(1);
all_end:
D8010=D8011=D8012=PLC_RUN_TIME; //保持扫描时间
PLC_RUN_TIME=0; //清除扫描时间
puls=0x01;
PLC_BIT_OFF(M8002),PLC_BIT_ON(M8003); //初始化脉冲用到8002 8003
}
else
{
PLC_BIT_OFF(M8000); //没有运行强制M80000为OFF
PLC_BIT_ON(M8001); //没有运行强制M80001为on
D8012=0;
edit_prog=0; //编程时要用到
puls=0; //初始化脉冲用到8002 8003
Stop_Lamp; //关闭运行灯,如果从运行状态切换到停止状态需要清除Y输出
if(Write_Pro_flag == 0)
{
RST_Y();
PLC_IO_Refresh(); //刷新Y输出
RST_T_D_C_M_data();
}
PLC_STL_CMD = PLC_STL_Status = 0; //上次程序中的步进
}
}
else
{
RST_Y(); //如果从运行状态切换到停止状态需要清除Y输出
PLC_BIT_OFF(M8000); //没有运行强制M80000为OFF
PLC_BIT_ON(M8001); //没有运行强制M80001为on
D8012=0;
edit_prog=0; //编程时要用到
puls=0; //初始化脉冲用到8002 8003
Stop_Lamp; //关闭运行灯
Write_Pro_flag = 0;
PLC_IO_Refresh();
PLC_STL_CMD = PLC_STL_Status = 0;
if(run_flag == 0)
{
run_flag = 1;
PLC_RUN_TIME=0;
RST_T_D_C_M_data();
}
}
PLC_16BIT[0X701]=0X000; //设置版本号
}