📄 main.c
字号:
/***********************************************************************************
* 载波监听上位机端程序。接收到总线上的申请信号。
************************************************************************************/
//#include "io430.h"
#include "io430x13x.h"
#include "in430.h"
#include <stdlib.h>
#define Address 'A' //本机地址
#define _Version_P_A 4224
#define MAXCOUNT 0X0FFF7
//#define _Project1 // 工数= number
#define _Project2 工数= number*Target/ConvertCode
unsigned char const AddressIndex[] ={'A','B','C','D','E','F','G','H','I','J','K',
'L','M','N','O','P','Q','R','S','T','U','V','W',
'X','Y','Z','a','b','c','d','e','f','g','h','i',
'j','k','l','m','n','o','p','q','r','s','t','u',
'v','w','x','y','z'
};
unsigned char const LedCode[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X00}; //数码管显示代码
unsigned char const DisplayCode[11] = {0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07,0X08,0X09,0X0A};
unsigned char const KeyCode[16] = {0X07,0X08,0X09,0X0F,0X04,0X05,0X06,0X0E,0X01,0X02,0X03,0X0D,0X00,0X0A,0X0B,0X0C};
unsigned char const SelectLed[8] = {0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
unsigned char const CodeTable[][9] = {{'|','|','?',':','*','~'}, //主控端通信忙
{'<','B','U','S','E','N','~'}, //有地址的子台 ,总线申请允许 | 非地址的子台,子台安静
{'|','|','<','F','R','B','U','S','~'}, //总线空闲,可以允许总线申请
{'1','~'}, //数据接收完毕
{'0','~'}, //数据发送错误指令
{'>','0','1','?',':','*','~'}, //异常灯点亮指令
{'>','0','2','?',':','(','~'} //异常灯点灭指令
};
unsigned char const AsciiTable[] = {0X30,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X38,0X39}; //ASCII编码表
const unsigned char ReceviceTable[][9] = {{Address,Address,'<','{','?',':','*','~'}, // 子台向PLC申请总线
{Address,Address,'0','0','?',':',')','~'}, //工位强制复位
{Address,Address,'0','1','?',':','*','~'}, //工位异常开启
{Address,Address,'0','2','?',':','+','~'}, //工位异常解除
{Address,Address,'1','~'}, //子台通信结束指令
{Address,Address,'0','~'} //子台要求重发指令
};
unsigned long const Baud[] = {115200,76800,57600,38400,19200,9600,4800};
unsigned char const BaudRate[][3] = {{0x22,0x00,0xED}, {0x34,0x00,0x40}, {0x45,0x00,0x4A}, {0x68,0x00,0x40},
{0xD0,0x00,0x40}, {0xA0,0x01,0xC0}, {0x41,0x03,0x00}};
unsigned char ReceviceBuff[30]; //数据接收缓冲器
unsigned char TransmitBuff[2]; //数据包打包格式数组缓冲器
unsigned char TotalProTemp[9][4]; //用于数据拆包临时变量
unsigned char DisplayKeyCode[12]; //段显示变量
unsigned int TotalPro[10]; //不良品数累计数
unsigned int TimeSec1[25][2]; //第一时间段数组
unsigned int TimeSec2[9][2]; //第二时间段数组]
unsigned char TimeSectionIndex; //时间段索引
unsigned char SecIndex; //段索引
unsigned char TimeIndex; //时间索引
unsigned int CovertVar; //段显码转换变量
unsigned char Key; //按键
unsigned char KeyTemp; //临时按键
unsigned int Flag; //标志变量
unsigned int UartFlag; //标志变量
signed char i; //变量i
unsigned char count; //记数
unsigned char Index; //波特率选择
unsigned char UartCount=0; //波特率记数
unsigned char UartCounter=0; //用于波特率记数1
unsigned char CheckSum; //校验和
unsigned char TimerCount; //定时器记数
unsigned char CommunicationErr; //通信错误变量
unsigned char ClockCount; //定时时钟记数
unsigned char Second; // 秒
unsigned char Min; //分
unsigned char Hour; //小时
unsigned char DisplayCodeTemp[4]; //临时数据数组
unsigned long DisplayFlg; //用于显示的标志
unsigned int ConvertCode=0;
unsigned int Plan; //计划
unsigned int WatchRecevice; //目标
unsigned int Real; //实绩
unsigned int Number; //工数
unsigned int SelfAddress; //本机地址变量
signed int ScaleClock; //时钟设定标尺
unsigned int temp; //临时变量
unsigned char temp1; //临时变量
unsigned int CounterForNumber; //工数记数器
unsigned char Counter; //时钟记数器
signed char SearchIndex; //查询索引
unsigned char ConflictFlag; // 冲突标志
unsigned char SoundTone;
unsigned char BaudBit;
unsigned char m_AddressIndex;
unsigned char ReciveTimer;
#define Baud1 115200 //波特率12
#define Baud2 76800 //波特率2
#define Baud3 57600 //波特率2
#define Baud4 38400 //波特率3
#define Baud5 19200 //波特率4
#define Baud6 9600 //波特率5
#define Baud7 4800 //波特率6
#define Key0 0X0C //数字键0
#define Key1 0X08 //数字键1
#define Key2 0X09 //数字键2
#define Key3 0X0A //数字键3
#define Key4 0X04 //数字键4
#define Key5 0X05 //数字键5
#define Key6 0X06 //数字键6
#define Key7 0X00 //数字键7
#define Key8 0X01 //数字键8
#define Key9 0X02 //数字键9
#define MODE 0X0D //功能键 MODE 用于波特率的设定
#define EXIT 0X0E //功能键 EXIT 用于程序的退出
#define ENT 0X0F //功能键 ENT 用于确认
#define CLR 0X0B //功能键 CLR 用于清除
#define DOWN 0X07 //功能键 DOWN 用于点减
#define UP 0X03 //功能键 UP 用于增加
//Flag标志
#define SwitchOn 0X01 //异常开关开启
#define SwitchOff 0X02 //异常开关解除
#define ResetFlg 0X10
#define BandSetFlg 0X20 //波特率设定标志
#define StartFlg 0X40 //启动不良品检测标志
#define BaudSet 0X80 //指令错误
#define LCJ 0X100 //闪烁标志1
#define ShrinkFlg_2 0X200 //闪烁标志2
#define FunClrFlg 0X400 //启动功能键
#define ReceiveFinish 0X800 //接受指令字完成标志
#define RUNFlg 0X1000 //CLR键被按下的标志
#define LowPowerFlg 0X2000 //闪烁标志3
#define ReceiveDataFlg 0X4000 //接收数据标志
#define LOWFlg 0X8000 //低位转换标志
//UartFlag标志
#define LinkHandFlg 0X01 //通信握手标志
#define ResetDataFlg 0X02 //读指令字
#define WriteFlg 0X04 //读指令字
#define ServerBusy 0X08 //指令结束格式 ?
#define Format_2 0X10 //指令结束格式 :
#define Format_3 0X20 //指令结束格式 ~
#define CheckOk 0X40 //指令校验正确标志
#define SendDataFlg 0X80 //发送数据指令
#define BUSENABLEFLG 0X100 //总线申请通过
#define CONFLICTFLG 0X200 //总线冲突
//Conflict标志
#define LINKSENDFLG 0X01 //总线申请发送完毕
#define NEEDCOMM 0X02 //子台有通信需求
#define SENDENABLE 0X04 //子台发送允许.总线释放
#define SENDDISABLE 0X08 //子台发送不允许,总线使用中..
#define HASLINKEDFLG 0X10 //已经与PLC建立链接
#define TIMEOUTFLG 0X20 //定时标志。用于定时接收数据
#define VANFLAG 0X40
#define ErrCodeFlg 0X20 //总线上乱码
//CommunicationErr标志
#define ReSendErr 0X01 //发送重发指令丢失
#define SendDataErr 0X02 //发送数据指令丢失
#define ConfirmErr 0X03 //发送正确接收指令丢失
#define LinkHandErr 0X04 //发送总线请求指令丢失
#define STATESENDERR 0X05 //发送开关信息指令丢失
#define FREEBUSERR 0X06 //总线释放指令丢失
#define BUSENABLEERR 0X08 //服务器端总线申请允许
#define EMERGENCYONERR 0X09 //服务器发送异常指令字
#define EMERGENCYOFFERR 0X10 //服务器端发送异常解除指令字
#define RESENDERR 0X11 //服务器发送重发指令字
#define BEQUIETERR 0X12 //服务器发送安静指令字
#define BUSFREEERR 0X13 //服务器发送总线释放指令字
//新加入的宏定义
#define MaxCount 9999 //显示的最大值
#define ShiftCode 0X80 //串行转换码
#define BaudDefault 0X05 //设定默认波特率为 19200
//用于显示标志位
#define DShrSetFlg 0X01 //第二行闪烁标志
#define DShrinkFlg 0x02 //数据超范围闪烁标志
#define DClockFlg 0X04 //设置时钟标志
#define PlanSetFlg 0X08 //计划设定标志
#define NumSetFlg 0X10 //工数设定标志
#define FirstFlg 0X20 //闪烁处理标志
#define ClockSetFlg 0X40 //时钟设定标志
#define ErrFlg 0X80 //出错标志
#define AddressSetFlg 0X100 //本机地址设定标志
#define StartShrinkFlg 0X200 //启动闪烁标志
#define TimeSection1SetFlg 0X400 //第一班时间设定
#define TimeSection2SetFlg 0X800 //第二班时间设定
#define TimeIndexFlg 0X1000 //时间检索标志
#define AutoCounterFlg 0X2000 //自动时间检测标志
#define ChangeWorkFlg 0X4000 //换班标志
#define CheckTimeFlg 0X8000 //比较标志
#define TimeFirstFlg 0X10000 // 时间第一次标志
#define P15DelayFlg 0X20000 //实绩开关延时标志
#define P16DelayFlg 0X40000 //启动开关延时标志
#define ShrinkFlg_1 0X00ff //无效标记
void Init(void); //初始化
void ReadBuzz(); //读dip
void SysInit(void); //系统初始化
void Delay10ms(int num); //延时程序
void Clock();
void SetBaud(int baud); //波特率设定
void Disper(void); //高位0消隐
void Disapper(void);
void DisplayLed(void); //显示LED
void SendData(const unsigned char * ,unsigned char ); //发送数据
//unsigned char DataPack(void); //数据打包处理
unsigned char CovertToAsc(void); //转换到ASCII
void FlashWrite(unsigned int TotalPro[]); //保存数据到闪存
void FlashRead(void);
unsigned char FlashBusy(void);
void FlashErase(unsigned int);
void ConvertData(int data);
void ConfirmData(); //确认数据的合法性
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
//FlashRead(); //读地址为0X1080的数据
for(i=0; i<12; i++)
{
DisplayKeyCode[i] =LedCode[0]; //初始显示为0
}
for(i=0; i<10; i++)
TotalPro[i] = 0;
Init();
while(1)
{
if((WatchRecevice >= 5)) //等待一桢传输结束
{
if((WatchRecevice >= 5) && (UartCounter <= 9)) //数据桢接收完毕~!
{
_DINT();
TBCCTL0 &= ~CCIE; //不允许定时器A中断
WatchRecevice = 0; //延时变量为0
UartCounter = 0;
if((ReceviceBuff[0] >= AddressIndex[0])
&& (ReceviceBuff[0] <= AddressIndex[31])) //总线上接收子台的地址
{
for(i=0; i<70; i++);
UartFlag = 0X00;
UartCount = 2;
while((ReceviceBuff[UartCount] == ReceviceTable[0][UartCount]) && (UartCount <9))
{ //收到子台总线申请指令字
if(UartCount == 7)
{
while((IFG1 & UTXIFG0) == 0);
TXBUF0 = ReceviceBuff[0];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -