?? lzkfunc.c
字號:
#include "LZK.H"
#include <stdio.h>
#define Vref 1.200
/***********************************************************************
*** DO開關量(控制輸出繼電器)功能說明:
(1)KQJ:KQ可控硅開通控制繼電器(常閉).
(2)LZJ:勵磁狀態繼電器(常開),LZJ決定是否進行RF檢測.
(3)LCJ:失步保護繼電器(常開),控制主電源開關或輸出給PLC.
(4)SZJ:跳閘停機繼電器(常開),后備保護用,輸出給PLC.
(5)BXJ:報警輸出繼電器(常開),用于接通聲光報警或輸出至PLC.
(6)TYJ:降壓起動繼電器(常開),控制輸出.
(7)YKJ:遙控繼電器(常開)
(8)N/A:
***********************************************************************/
uint8 bdata RelayOUT = 0; // Output Relay STATUS.
// sbit ZJJ_OUT = RelayOUT^7; // N/A.
sbit YKJ_OUT = RelayOUT^6; // YKJ Output Relay No.6.遙控狀態輸出
sbit TYJ_OUT = RelayOUT^5; // TYJ Output Relay No.5.降壓啟動控制輸出
sbit BXJ_OUT = RelayOUT^4; // BXJ Output Relay No.4.報警輸出
sbit SZJ_OUT = RelayOUT^3; // SZJ Output Relay No.3.失步再整步失敗狀態輸出
sbit LCJ_OUT = RelayOUT^2; // LCJ Output Relay No.2.失步狀態輸出
sbit LZJ_OUT = RelayOUT^1; // LZJ Output Relay No.1.KQ誤導通檢測使能控制
sbit KQJ_OUT = RelayOUT^0; // KQJ Output Relay No.0.KQ控制繼電器
/***********************************************************************
*** DI開關量(狀態輸入繼電器)功能說明:
(1)DLJ:電機加電狀態輸入(常開),由PLC輸入.
(2)RFJ:KQ導通檢測(常開),RFJ閉合表示KQ導通.
(3)FCJ:斷電保護輸入(常開),由PLC輸入,防止對電機的沖擊.
(4)JYJ:降壓起動輸入(常開),由PLC輸入.
(5)ZCJ:增值(常開),遙控增值.
(6)JCJ:減值(常開),遙控減值.
(7)YCJ:遙控狀態繼電器,由PLC輸入.
(8)DYJ:低壓狀態輸入.
***********************************************************************/
uint8 bdata RelayIN = 0xff; // Digital Input STATUS.
sbit DYJ_IN = RelayIN^7; // DYJ Input Relay No.7.低電壓強勵控制輸入
sbit YCJ_IN = RelayIN^6; // YCJ Input Relay No.6.遙控狀態控制輸入
sbit JCJ_IN = RelayIN^5; // JCJ Input Relay No.5.減值
sbit ZCJ_IN = RelayIN^4; // ZCJ Input Relay No.4.增值
sbit JYJ_IN = RelayIN^3; // JYJ Input Relay No.3.降壓啟動控制輸入
sbit FCJ_IN = RelayIN^2; // FCJ Input Relay No.2.防沖擊輸入<DSJ斷電失步保護繼電器>
sbit RFJ_IN = RelayIN^1; // RFJ Input Relay No.1.RF誤導通信號輸入
sbit DLJ_IN = RelayIN^0; // DLJ Input Relay No.0.電機啟動控制信號輸入
/*****************************************************************
*** 相差法測量電動機電源功率因數,PhasePole為DUx的過零檢測波形
*****************************************************************/
uint8 bdata PwrFact_MsrFLAG = 0x00;
sbit DUxCO_LastVal = PwrFact_MsrFLAG ^ 7; // DUx
sbit DUxCO_CurrVal = PwrFact_MsrFLAG ^ 6; //
sbit PwrFact_CurLoopMsrOVER = PwrFact_MsrFLAG ^ 5; //
sbit PwrFact_CurLoopMsrEN = PwrFact_MsrFLAG ^ 4; //
sbit PwrFact_CalcMsrOVER = PwrFact_MsrFLAG ^ 3; // Every Wave 32 Points.
sbit PwrFact_CalcMsrEN = PwrFact_MsrFLAG ^ 2; //
sbit PwrFact_PhaDiffMsrOVER = PwrFact_MsrFLAG ^ 1; // Average for 8 Periods.
sbit PwrFact_PhaDiffMsrEN = PwrFact_MsrFLAG ^ 0; //
uint8 data DUxCO_RisTimCNT = 0;
uint8 data PwrFact_PhaDiffMsrCNT = 0;
UINTC data PwrFact_PhaDiffMsrDATA[8];
/****************************************************************************
*** 外部變量.
****************************************************************************/
extern uint16 xdata *InFlashWrPtr; // Internal FLASH Write Addr Point.
extern uint16 code *InFlashRdPtr; // Internal FLASH Read Addr Point.
/****************************************************************************
** 函數名稱: T0_ISR()
** 功能描述: T0定時器中斷處理,中斷間隔125uS
(1)125uS時間基準:分為5個相位;
(2)WDT清除;
(3)A/D采樣:UF,IF,DU,DI,CurrRingEY,CurrRingEI;
(4)DI讀入: UFCO,IFCO,SYNCx,RelayIN;
(5)DO輸出: RelayOUT,PulseOUT;
(6)功率因數相差法TIMER1測量結果讀入;
** 入口參數: 無
** 出口參數: 無
** 全局變量: 無
** 調用模塊: 無
** 說明:
****************************************************************************/
void T0_ISR(void) interrupt 1
{
uint8 ucTMP;
SFRPAGE = TIMER01_PAGE; // Change to TIMER01 PAGE.
TF0 = 0;
WDTCN = 0xA5; // Enable WDT or Reload the WDT.
SFRPAGE = 0x0f; // P5 SFR PAGE.
/*****************************************************************
*** DI開關量(狀態輸入繼電器)讀入(8路);
*****************************************************************/
P5MDOUT = 0x00; // P5口設置為漏極開路,輸入方式.
P5MDOUT = 0x00; // P5口設置為漏極開路,輸入方式.
nReInLE = 0; // Relay Input Enabled.
nReInLE = 0; // Relay Input Enabled.
RelayIN = P5; // Read Relay Digital Input.
nReInLE = 1; // Relay Input Disabled.
/*****************************************************************
*** DO開關量(控制輸出繼電器)輸出(8路);
*****************************************************************/
P5MDOUT = 0xff; // P5口設置為推挽輸出,輸出方式.
P5MDOUT = 0xff; // P5口設置為推挽輸出,輸出方式.
ReOutLE = 1; // Relay Output Latch Enabled.
ReOutLE = 1; // Relay Output Latch Enabled.
P5 = RelayOUT; // Relay Digital Output.
ReOutLE = 0; // Relay Output Latch Disabled.
/*****************************************************************
*** DLJ釋放或吸合動作處理.
*****************************************************************/
DLJ_LastVal = DLJ_CurrVal; // 保存DLJ狀態.
DLJ_CurrVal = DLJ_IN; // 讀取DLJ當前狀態.
if( DLJ_CurrVal != DLJ_LastVal ) // DLJ狀態改變.
{
if( DLJ_CurrVal == 0 ) // 開機啟動.
{
MotNmlVoltStaUpEN = 1; // 電機正常啟動允許使能.
DLJ_StopProDONE = 0; // 復位停機處理標志.
}
else // 停機.
{
if( DLJ_StopProDONE == 0 ) // 未進行過停機處理.
{
TrigPulseOutEN = 0; // 禁止可控硅觸發脈沖輸出.
// LCD顯示“電機停機”.
// 所有DO復位,DO = "0xff".
// 所有計數器、定時器和標志位復位.
DLJ_StopProDONE = 1; // 置已停機處理標志.
}
}
}
else
{
if( DLJ_CurrVal == 1 ) // 等待啟動信號.
{
if( JYJ_IN == 0 ) // 降壓啟動信號.
{
MotLowVoltStaUpEN = 1; // 電機啟動允許使能.
}
}
}
/*****************************************************************
*** 可控硅觸發脈沖輸出,與SYNCa同步,SYNCa同步信號周期更新.
*****************************************************************/
SYNCa_LastVal = SYNCa_CurrVal; // 保存SYNCa狀態
SYNCa_CurrVal = SYNCa; // 讀取SYNCa當前狀態
if( TrigPulseOutEN == 1) // 可控硅觸發脈沖輸出
{
if( SYNCa_CurrVal != SYNCa_LastVal) // SYNCa上升沿或下降沿
if( SYNCa_CurrVal == 1 ) // SYNCa上升沿,“0”-->“1”
{
TrigOutSyncTimCNT = 0; // 重新同步
TrigOutSyncTimCntEN = 1; // 同步計數使能,避免計時誤差累積
}
if( EM_RegBrdgMode == 0 ) // EM Half Bridge,勵磁為半橋形式.
{
if( TrigOutSyncTimCNT == TrigOutPosiA_OnTim ) // Trig Phase A+ ON.
PulseOutPut(0x7f & TrigOutPosiA_ON);
if( TrigOutSyncTimCNT == TrigOutPosiA_OffTim ) // Trig Phase A+ OFF.
PulseOutPut(0x7f);
if( TrigOutSyncTimCNT == TrigOutPosiB_OnTim ) // Trig Phase B+ ON.
PulseOutPut(0x7f & TrigOutPosiB_ON);
if( TrigOutSyncTimCNT == TrigOutPosiB_OffTim ) // Trig Phase B+ OFF.
PulseOutPut(0x7f);
if( TrigOutSyncTimCNT == TrigOutPosiC_OnTim ) // Trig Phase C+ ON.
PulseOutPut(0x7f & TrigOutPosiC_ON);
if( TrigOutSyncTimCNT == TrigOutPosiC_OffTim ) // Trig Phase C+ OFF.
PulseOutPut(0x7f);
}
else // EM Full Bridge,勵磁為全橋形式.
{
if( TrigOutSyncTimCNT == TrigOutPosiA_OnTim ) /* Trig Phase A+ ON */
PulseOutPut(0x7f & TrigOutPosiA_ON & TrigOutNegaB_ON);
if( TrigOutSyncTimCNT == TrigOutPosiA_OffTim ) /* Trig Phase A+ OFF*/
PulseOutPut(0x7f);
if( TrigOutSyncTimCNT == TrigOutNegaC_OnTim ) /* Trig Phase C- ON */
PulseOutPut(0x7f & TrigOutPosiA_ON & TrigOutNegaC_ON);
if( TrigOutSyncTimCNT == TrigOutNegaC_OffTim ) /* Trig Phase C- OFF*/
PulseOutPut(0x7f);
if( TrigOutSyncTimCNT == TrigOutPosiB_OnTim ) /* Trig Phase B+ ON */
PulseOutPut(0x7f & TrigOutNegaC_ON & TrigOutPosiB_ON);
if( TrigOutSyncTimCNT == TrigOutPosiB_OffTim ) /* Trig Phase B+ OFF*/
PulseOutPut(0x7f);
if( TrigOutSyncTimCNT == TrigOutNegaA_OnTim ) /* Trig Phase A- ON */
PulseOutPut(0x7f & TrigOutPosiB_ON & TrigOutNegaA_ON);
if( TrigOutSyncTimCNT == TrigOutNegaA_OffTim ) /* Trig Phase A- OFF*/
PulseOutPut(0x7f);
if( TrigOutSyncTimCNT == TrigOutPosiC_OnTim ) /* Trig Phase C+ ON */
PulseOutPut(0x7f & TrigOutNegaA_ON & TrigOutPosiC_ON);
if( TrigOutSyncTimCNT == TrigOutPosiC_OffTim ) /* Trig Phase C+ OFF*/
PulseOutPut(0x7f);
if( TrigOutSyncTimCNT == TrigOutNegaB_OnTim ) /* Trig Phase B- ON */
PulseOutPut(0x7f & TrigOutPosiC_ON & TrigOutNegaB_ON);
if( TrigOutSyncTimCNT == TrigOutNegaB_OffTim ) /* Trig Phase B- OFF*/
PulseOutPut(0x7f);
}
if( TrigOutSyncTimCntEN == 1 )
{
TrigOutSyncTimCNT++;
if( TrigOutSyncTimCNT >= 161 )
{
TrigOutSyncTimCNT = 0;
TrigOutSyncTimCntEN = 0; // 防止因SYNCa錯誤導致觸發脈沖錯誤
}
}
}
else
PulseOutPut(0xff); // 輸出保護,脈沖輸出指示iLED熄滅.
/*****************************************************************
*** 相差法測量電動機電源功率因數,PhasePole(DUxCO)為DUx的過零檢測波形
*****************************************************************/
/*
uint8 bdata PwrFact_MsrFLAG = 0x00;
sbit DUxCO_LastVal = PwrFact_MsrFLAG ^ 7; // DUxCO歷史狀態
sbit DUxCO_CurrVal = PwrFact_MsrFLAG ^ 6; // DUxCO當前狀態
sbit PwrFact_CurLoopMsrOVER = PwrFact_MsrFLAG ^ 5; // 功率因數電流環法單次測量結束
sbit PwrFact_CurLoopMsrEN = PwrFact_MsrFLAG ^ 4; // 功率因數電流環法測量使能
sbit PwrFact_CalcMsrOVER = PwrFact_MsrFLAG ^ 3; // 功率因數計算法單次測量結束
sbit PwrFact_CalcMsrEN = PwrFact_MsrFLAG ^ 2; // 功率因數計算法測量使能
sbit PwrFact_PhaDiffMsrOVER = PwrFact_MsrFLAG ^ 1; // 功率因數相差法單次測量結束
sbit PwrFact_PhaDiffMsrEN = PwrFact_MsrFLAG ^ 0; // 功率因數相差法測量使能
uint8 xdata DUxCO_RisTimCNT = 0; // DUxCO上升沿次數
uint8 xdata PwrFact_PhaDiffMsrCNT = 0; // 功率因數相差法測量次數
INTUC xdata PwrFact_PhaDiffMsrDATA[8]; // 功率因數相差法單次測量數據
uint16 xdata PwrFact_PhaDiffMsrResult; // 功率因數相差法測量結果
*/
if( PwrFact_PhaDiffMsrEN == 1 )
{
DUxCO_LastVal = DUxCO_CurrVal; // 保存DUxCO狀態
DUxCO_CurrVal = PhasePole; // 讀取DUxCO當前狀態
if( DUxCO_CurrVal != DUxCO_LastVal )
if( DUxCO_CurrVal == 1 ) // 識別DUxCO上升沿
{
if( DUxCO_RisTimCNT == 0 ) // TIMER1沒有開始計數
{
SFRPAGE = TIMER01_PAGE; // Change to Timer1 Page
TR1 = 1; // T1 Begin.
}
else
DUxCO_RisTimCNT++;
if( DUxCO_RisTimCNT == 3 ) // 在第三次DUxCO上升沿中止TIMER1
{
SFRPAGE = TIMER01_PAGE; // Change to Timer1 Page
TR1 = 0; // T1 STOP.
PwrFact_PhaDiffMsrDATA[PwrFact_PhaDiffMsrCNT].ucVAR[0] = TL1;
PwrFact_PhaDiffMsrDATA[PwrFact_PhaDiffMsrCNT].ucVAR[1] = TH1;
TH1 = 0; // TH1_INIT = 0x00;
TL1 = 0; // TL1_INIT = 0x00;
DUxCO_RisTimCNT = 0; //
PwrFact_PhaDiffMsrCNT++;
if( PwrFact_PhaDiffMsrCNT == 8 )
{
PwrFact_PhaDiffMsrOVER = 1;// 置本輪測量結束標記,等待計算測量結果.
PwrFact_PhaDiffMsrEN = 0; // 計算結果期間停止測量.
}
}
}
}
/*****************************************************************
*** TIMER 0 SLOT 0
*** (1)啟動錄波功能:32 Points / Period; Time Interevl 625uS;
*** (2)SYNCa、SYNCb和SYNCc同步信息缺失或相序錯誤檢測;
*** (3)失控檢測;
*****************************************************************/
if( TimSlotCNT == 0 ) // Time Slot 1;
{
/*****************************************************************
*** 啟動錄波功能:32 Points / Period; Time Interevl 625uS;
*****************************************************************/
/*
#define ByteNumMaxPerPage 65534
#define ExSramWrRdPagMax 2
MotStaUpEmWaveRecEN;
MotStaUpEmVoltRecEN;
MotStaUpEmWaveRecOVER;
uint8 idata ExSramWrRdPag; // 外部SRAM頁
uint16 idata ExSramWrRdAdr; // 外部SRAM讀寫地址
INTUC idata AD_DataBuff; // A/D數據緩沖
*/
if( MotStaUpEmWaveRecEN == 1 ) // 啟動錄波功能是否開啟
{
if( MotStaUpEmVoltRecEN == 1 ) // 1/0: EmVolt / EmCurr;
ADC0_CH_Setting(0x02); // AIN02 for EmVolt.
else
ADC0_CH_Setting(0x03); // AIN03 for EmCurr.
AD0INT = 0; // RST ADC Convert Complete Flag.
AD0BUSY = 1; // Start ADC0
while( AD0INT == 0 ); // Wait for Convert Over
if( ExSramWrRdAdr & 0x01 == 0 ) // Even Address.
{
AD_DataBuff.ucVAR[1] = ADC0H; // Get High 8 Byte.
AD_DataBuff.ucVAR[0] = ADC0L & 0xf0; // Get Low 4 Byte.
ExSRAM_PageSetting( ExSramWrRdPag ); // 切換到外部SRAM
ExSramWrRdAdrPt = ExSramWrRdAdr; //
*ExSramWrRdAdrPt = AdcDatBuff.ucVAR[1]; // Save High 8 Byte
ExSramWrRdAdr++;
ExInSRAM_Select(0); // 切換回內部SRAM
}
else
{
AD_DataBuff.ucVAR[1] = ADC0H; // Get High 8 Byte.
ucTMP = ADC0L; // Get Low 4 Byte.
ucTMP = ucTMP >> 4; // Unite with Last Sample's Low 4 Byte.
AD_DataBuff.ucVAR[0] = ucTMP | AD_DataBuff.ucVAR[0];
ExSRAM_PageSetting( ExSramWrRdPag ); // 切換到外部SRAM
ExSramWrRdAdrPt = ExSramWrRdAdr;
*ExSramWrRdAdrPt = AD_DataBuff.ucVAR[0];// Save Low 8 Byte.
ExSramWrRdAdr++;
ExSramWrRdAdrPt = ExSramWrRdAdr;
*ExSramWrRdAdrPt = AD_DataBuff.ucVAR[1];// Save High 8 Byte.
ExSramWrRdAdr++;
ExInSRAM_Select(0); // 切換回內部SRAM
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -