?? plc51x.c
字號:
/*----------------------------------------------------------------------------------------------------*/
/* */
/* PLC 梯型圖 解釋型監(jiān)控 C Code示范程序(用于 51單片機) */
/* */
/* 為防止 PLC 指令編碼和 C 語言關鍵字混淆,特規(guī)定,在本監(jiān)控程序中,所有 PLC 指令前面加下劃線"_", */
/* 所有點(BIT型)前后各加下劃線"_",所有點(WORD型)前加下劃線"_",指令后面的數(shù)據(jù)用( )包含,數(shù)據(jù) */
/* 中間用","分隔,以示和 C 語言關鍵字區(qū)分及適應于 C 語言書寫方法。 */
/* 所有十進制常數(shù)去掉前導"K",所有十六進制常數(shù)去掉前導"H"再加前導數(shù)字"0x",以便適應于 C 語言常 */
/* 數(shù)書寫方法。這些下劃線和加減前導數(shù)字將由 PLC 梯型圖反編譯程序自動加入。 */
/* */
/* 說心里話,這種容量小、功能少的 PLC,用匯編是最佳選擇,程序精練、執(zhí)行效率高,比如散轉(zhuǎn)指令,用 */
/* C語言的函數(shù)指針效率大打折扣,但考慮到方便大家今后程序的移植、更改、提高,使之能適應于 AVR,STM8, */
/* NEC,PIC,H8,STM32......等任何單片機,未使用 51單片機特有的 bit 操作指令,關鍵部位也未插入?yún)R編, */
/* 等程序修改穩(wěn)定后再修改相關指令,優(yōu)化程序代碼,提升執(zhí)行速度,使之更適合 51單片機的使用。 */
/* */
/* 本程序支持混合編程,即在 PLC 指令編碼中可任意插入 C 語言語句,符合 C 語言規(guī)范的匯編語言語句。 */
/* 可使用現(xiàn)有的調(diào)試軟件仿真器設置斷點,單步,多步,跟蹤,連續(xù),全速等手段調(diào)試 PLC 程序,修改和監(jiān)控 */
/* PLC 點元件狀態(tài)和內(nèi)容,使之更適合廣大單片機愛好者使用。 */
/* */
/* 目前支持下列點(繼續(xù)完善中): */
/* _X0_---_X57_,_Y0_---_S57_,_M0_---_M255_,_S0_---_S255_,_T0---_T31,_C0---_C31,_D0---_D31; */
/* */
/* 目前支持常數(shù)(繼續(xù)完善中): */
/* K 范圍:-32768---32767; H 范圍:0---FFFFH; */
/* */
/* 目前支持特殊點數(shù)(繼續(xù)完善中): */
/* _M8000_,_M8001_,_M8002_,_M8003_,_M8004_,_M8011_,_M8012_,_M8013_,_M8014_, */
/* _M8020_,_M8021_,_M8022_; */
/* */
/* 目前支持下列基本指令和擴展指令(繼續(xù)完善中): */
/* _LD,_LDI,_AND,_ANI,_OR,_ORI,_INV,_OUT(_OUT_T,_OUT_C),_SET,_RST,_ANB,_ORB,_LDP,_LDF,_ANDP,_ANDF, */
/* _ORP,_ORF,_PLS,_PLF,_MPS,_MRD,_MPP,_NOP,END,_ADD,_SUB,_MUL,_DIV,_INC,_DEC,_WAND,_WOR,_WXOR, */
/* _NEG,_ALT,_MOV,_CML,_XCH,_BCD,_BIN,_CMP,_ZCP,_FMOV,_ROR,_ROL,_ZRST,_REF,_ASCI,_SWAP,_CJ,_CALL, */
/* _SRET,_FEND,_LD>=,_LD<=,_LD>,_LD<,_LD<>,_LD=,_AND>=,_AND<=,_AND>,_AND<,_AND<>,_AND=,_OR>=,_OR<=, */
/* _OR>,_OR<,_OR<>,_OR=; */
/* */
/* 由于 C語言無法識別下列符號,特用下列英文縮寫表示: */
/* 大于等于(>=) _GE,小于等于(<=) _LE,大于(>) _GT,小于(<) _LT,不相等(<>) _NE,相等(=) _EQ; */
/* 即指令集:_LD>=,_LD<=,_LD>,_LD<,_LD<>,_LD=,_AND>=,_AND<=,_AND>,_AND<,_AND<>,_AND=, */
/* _OR>=,_OR<=,_OR>,_OR<,_OR<>,_OR=; */
/* 用下列指令書寫方式替代。 */
/* _LD_GE,_LD_LE,_LD_GT,_LD_LT,_LD_NE,_LD_EQ,_AND_GE,_AND_LE,_AND_GT,_AND_LT,_AND_NE,_AND_EQ, */
/* _OR_GE,_OR_LE,_OR_GT,_OR_LT,_OR_NE,_OR_EQ; */
/* */
/* */
/* C P U : MPC82G516A(51系列)單片機 */
/* 晶 振: 11.0592MHz */
/* 作 者: 許意義 */
/* 版 本: V1.1.5 */
/* 日 期: 2009.10.10 */
/* 版 權: ourDEV.cn */
/* */
/*----------------------------------------------------------------------------------------------------*/
/* 歷次修改記錄: */
/*----------------------------------------------------------------------------------------------------*/
/* 版 本: V1.1.5 */
/* 修改人: 許意義 */
/* 日 期: 2009.10.10 */
/* 備 注: 修改了網(wǎng)友 winmcu 查出的 BUG , PLS 和 PLF指令運行異常現(xiàn)象, 已修正。 */
/* */
/*----------------------------------------------------------------------------------------------------*/
/* 版 本: V1.1.4 */
/* 修改人: 許意義 */
/* 日 期: 2009.10.9 */
/* 備 注: 修改了網(wǎng)友 oste 查出的 BUG , ALT指令運行異常現(xiàn)象, 已修正。 */
/* 并增加了PLC程序缺少END指令及運行錯誤指令會馬上停止報錯。 */
/* */
/*----------------------------------------------------------------------------------------------------*/
/* 版 本: V1.1.3 */
/* 修改人: 許意義 */
/* 日 期: 2009.10.9 */
/* 備 注: 修改了網(wǎng)友 oste 查出的 BUG , CMP指令,ZCP指令運行異常現(xiàn)象, 已修正。 */
/* */
/*----------------------------------------------------------------------------------------------------*/
/* 版 本: V1.1.2 */
/* 修改人: 許意義 */
/* 日 期: 2009.10.8 */
/* 備 注: 修改了網(wǎng)友 oste 和 winmcu 查出的 BUG , KnMx類變量 x非4的倍數(shù)出錯,M801x時鐘變量脈沖類 */
/* 指令出錯,AND類指令出錯,均已修正。 */
/* */
/*----------------------------------------------------------------------------------------------------*/
/* 版 本: V1.1.1 */
/* 修改人: 許意義 */
/* 日 期: 2009.10.8 */
/* 備 注: 修改了網(wǎng)友 oste 查出的 BUG , 計數(shù)器在每次接通時的上升沿才應該計數(shù)(加1),已修正。 */
/* */
/*----------------------------------------------------------------------------------------------------*/
/* 版 本: V1.1.0 */
/* 修改人: 許意義 */
/* 日 期: 2009.10.3 */
/* 備 注: 增加了對KnX,KnY,KnM,KnS變量的支持, 增加了對CJ,CALL等指令的支持。 */
/* */
/*----------------------------------------------------------------------------------------------------*/
/* 版 本: V1.0.9 */
/* 修改人: 許意義 */
/* 日 期: 2009.10.1 */
/* 備 注: 修改了網(wǎng)友 houjingqing 和 winmcu 查出的 BUG , 部分變量 初始化不正確,已修正。 */
/* */
/*----------------------------------------------------------------------------------------------------*/
/* 版 本: V1.0.8 */
/* 修改人: 許意義 */
/* 日 期: 2009.09.30 */
/* 備 注: 修改了網(wǎng)友 oste 查出的 BUG , 下載完剛運行時,時間繼電器的時基會變小,定時值很快就到了, */
/* 已修正。 */
/* */
/*----------------------------------------------------------------------------------------------------*/
/* 版 本: V1.0.7 */
/* 修改人: 許意義 */
/* 日 期: 2009.09.30 */
/* 備 注: 修改了網(wǎng)友 houjingqing 和 oste 查出的 BUG , 數(shù)據(jù)比較類 指令錯誤,已修正。 */
/* */
/*----------------------------------------------------------------------------------------------------*/
/* 版 本: V1.0.6 */
/* 修改人: 許意義 */
/* 日 期: 2009.09.26 */
/* 備 注: 修改了網(wǎng)友 oste 查出的 BUG , OUT T0 D30 指令錯誤,已修正。 */
/* */
/*----------------------------------------------------------------------------------------------------*/
/* 版 本: V1.0.5 */
/* 修改人: 許意義 */
/* 日 期: 2009.09.25 */
/* 備 注: 將“簡易PLC 梯型圖(指令編碼)轉(zhuǎn) 51 C 程序示范程序”和“仿三菱 FX1N PLC 下載通訊協(xié)議 */
/* C Code示范程序”合并,使之真正成為直接兼容 三菱FXGPWIN 軟件 的 開源PLC。 */
/* */
/*----------------------------------------------------------------------------------------------------*/
#include "SYSTEM.h"
#include "PLC51x_TYPE.H"
#include "PLC51x_SYS.H"
#include "PLC51x.H"
#include "PLC51x_FNC.H"
bit RUN = 0;
unsigned int code TYPE_BCD[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, // LED顯示器段碼表
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; // 0123456789AbCdEF
/***************************************************************************************/
unsigned char Timer_5ms; // 5ms時基計數(shù)器,5ms Timer0中斷計數(shù)
unsigned char Timer_10ms; // 10ms時基計數(shù)器,5ms Timer0中斷計數(shù)
unsigned char Timer_100ms; // 100ms時基計數(shù)器,5ms Timer0中斷計數(shù)
unsigned char Pulse_val_Sec; // 1s時基計數(shù)器
unsigned char Pulse_val_Min; // 1min時基計數(shù)器
bit Pulse_10ms ;
bit Pulse_100ms;
bit Pulse_Sec ;
bit Pulse_Min ;
/***************************************************************************************/
volatile unsigned char data ACC_BIT; // 位運算器及 7級中間過渡棧
volatile unsigned char data MPS_BIT; // 位元件 8級堆棧
//-------------------------------------------------------------------------------------//
// 位元件 D 內(nèi)存分配 //
//-------------------------------------------------------------------------------------//
volatile TYPE_BIT_BYTE data rX[_X_BYTE] , rY[_Y_BYTE]; // 位元件 X,Y 存儲位
volatile TYPE_BIT_BYTE data rX1[_X_BYTE], rY1[_Y_BYTE]; // 位元件 X,Y 存儲位上一步備份
volatile TYPE_BIT_BYTE data rM8xxx[3]; // 位元件 M8xxx 存儲位
volatile TYPE_BIT_BYTE data rM8xxx1[3]; // 位元件 M8xxx 存儲位上一步備份
volatile TYPE_BIT_BYTE data rTF[_T_BYTE]; // T 得電失電標志位
volatile TYPE_BIT_BYTE data rCF[_C_BYTE]; // C 得電失電標志位
volatile TYPE_BIT_BYTE data rT[_T_BYTE] , rC[_C_BYTE]; // 位元件 T,C 輸出位
volatile TYPE_BIT_BYTE data rT1[_T_BYTE], rC1[_C_BYTE]; // 位元件 T,C 輸出位上一步備份
volatile TYPE_BIT_BYTE xdata rM[_M_BYTE]; // 位元件 M 存儲位
volatile TYPE_BIT_BYTE xdata rS[_S_BYTE]; // 位元件 S 存儲位
volatile TYPE_BIT_BYTE xdata rM1[_M_BYTE]; // 位元件 M 存儲位上一步備份
volatile TYPE_BIT_BYTE xdata rS1[_S_BYTE]; // 位元件 S 存儲位上一步備份
volatile signed int xdata _T[_T_num][2]; // 位元件 T 內(nèi)存分配
volatile signed int xdata _C[_C_num]; // 位元件 C 內(nèi)存分配
volatile signed int xdata _D[_D_num]; // 位元件 D 內(nèi)存分配
//-------------------------------------------------------------------------------------//
// 基本指令,擴展指令 子函數(shù) //
//-------------------------------------------------------------------------------------//
volatile unsigned char xdata addr0T,addr1T,addr2T,addr3T,addr4T; // 數(shù)據(jù)位第一至第五位字地址/數(shù)據(jù)類型
volatile TYPE_BYTES_WORD xdata addr0x,addr1x,addr2x,addr3x,addr4x; // 數(shù)據(jù)位第一至第五位字地址/數(shù)據(jù)緩沖區(qū)
volatile TYPE_BYTES_WORD xdata order0; // 命令位地址緩沖區(qū)
volatile unsigned int ppp;
volatile unsigned char code *CODE_p;
#if DEBUG
unsigned char code CODE_START[PLCSTEP*4] = {0x0,0x24,0x8,0x0,0x0,0x88,0x0,0x28,0x0,0xd5,0x1,0x24,0x9,
0x0,0x1,0x88,0x1,0x28,0x0,0xe5,0xca,0x1,0x2,0x84,0x2,0xc8,0x2,0x28,0x1,0xd5,0xcb,0x1,0x2,0x84,0x3,
0xc8,0x3,0x28,0x1,0xe5,0x0f,0x0
};
/*
unsigned char code CODE_START[PLCSTEP*4] = {0x00,0x24,0x00,0xd5, // 模擬PLC運行代碼
0x01,0x24,0x00,0xe5,0x02,0x24,0x01,0xd5,0x03,0x24,0x01,0xe5,0x04,0x24,0x02,0xd5,
0x05,0x24,0x02,0xe5,0x06,0x24,0x03,0xd5,0x07,0x24,0x03,0xe5,0x08,0x24,0x04,0xc5,
0x09,0x24,0xfd,0xff,0x05,0xc5,0x0a,0x24,0x06,0xc5,0x0b,0x24,0xfd,0xff,0x07,0xc5,
0x0f,0x00,0xff,0xff,0xff,0xff };
*/
/*
unsigned char code CODE_START[PLCSTEP*2] = {
0x0,0x2f,0x1,0x6,0xa,0x80,0x0,0x80,0x1,0x26,0x0,0xc5,0x0,0x25,0x2,0x6,0xa,0x80,0x0,0x80,0x2,0x26,
0x1,0xc5,0x1,0x25,0x3,0x6,0xa,0x80,0x0,0x80,0x3,0x26,0x2,0xc5,0x2,0x25,0x4,0x6,0xa,0x80,0x0,0x80,
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -