📄 st3000.c
字号:
if( !((Edition3K.YtzMachID==1) || (Edition3K.YtzMachID==2)) )
{ Edition3K.YtzMachID=1;}
fseek(DataFile, 0, SEEK_SET);
fread(unit, sizeof(Units)*MAXCNL_3K, 1, DataFile);
fread(&SysSet, sizeof(SystemSettings), 1, DataFile);
fread(&Str6xtcs, sizeof(Str6xt), 1, DataFile);
/*
开始检验参数
*/
if( SysSet.CofBanA>25000 || SysSet.CofBanA<2500 )
{ SysSet.CofBanA=10000;}
if( SysSet.CofBanB>25000 || SysSet.CofBanB<2500 )
{ SysSet.CofBanB=10000;}
if( SysSet.ASignTangle<20 || SysSet.ASignTangle>45 )
{ SysSet.ASignTangle=45;}
if( SysSet.BSignTangle<20 || SysSet.BSignTangle>45 )
{ SysSet.BSignTangle=45;}
SysSet.ColorWidthA=2000;
SysSet.ColorWidthB=2000;
if( SysSet.VCoef<1 || SysSet.VCoef>500 )
{ SysSet.VCoef=100;}
if( SysSet.HCoef<1 || SysSet.HCoef>500 )
{ SysSet.HCoef=100;}
if( SysSet.bitTurns.TurnofLabsA<1 || SysSet.bitTurns.TurnofLabsA>5 )
{ SysSet.bitTurns.TurnofLabsA=1;}
if( SysSet.bitTurns.TurnofLabsB<1 || SysSet.bitTurns.TurnofLabsB>5 )
{ SysSet.bitTurns.TurnofLabsB=1;}
if( SysSet.bitShape.ShapeA>6 ) { SysSet.bitShape.ShapeA=0;}
if( SysSet.bitShape.ShapeB>6 ) { SysSet.bitShape.ShapeB=0;}
/*
设置状态记录的默认值
*/
memset(&EntireStatus, 0, sizeof(tagEntireStatus));
VarST3000.UnitCounts=MAXCNL_3K;
for(t=0; t<MAXCNL_3K; t++)
{
// 手动电机关闭
unit[t].submenu6.VMotorControls=0;
unit[t].submenu6.HMotorControls=0;
// 纵/横向维持手动
unit[t].submenu1.bitfield.hand_auto=0;
unit[t].submenu1.bitfield.h_motorruning=0;
unit[t].submenu1.bitfield.secondprint=0;
unit[t].submenu1.bitfield.autowork=0;
if( unit[t].submenu1.unitworksnum.i==1 )
{ bSingleShape=SysSet.bitShape.ShapeA;}
else if( unit[t].submenu1.unitworksnum.i==2 )
{ bSingleShape=SysSet.bitShape.ShapeB;}
else
{ bSingleShape=4;}
if( (bSingleShape==4 && unit[t].submenu1.bitfield.hcontrol) )
{ unit[t].submenu1.bitfield.hcontrol=0;}
//___Confirm addressofwav Legality.
if( unit[t].submenu1.addressofwav<0 || unit[t].submenu1.addressofwav>1999 )
{ unit[t].submenu1.addressofwav=0;}
//___Confirm ValueWidth Legality.
if( unit[t].submenu2.ValueWidth<5 || unit[t].submenu2.ValueWidth>20 )
{ unit[t].submenu2.ValueWidth=14;}
//___Confirm DofRoll Legality.
if( unit[t].submenu6.DofRoll<80 || unit[t].submenu6.DofRoll>160 )
{ unit[t].submenu6.DofRoll=128;}
//___Confirm v_alarm Legality.
if( unit[t].submenu1.v_alarm<1 || unit[t].submenu1.v_alarm>100 )
{ unit[t].submenu1.v_alarm=30;}
//___Confirm h_alarm Legality.
if( unit[t].submenu1.h_alarm<1 || unit[t].submenu1.h_alarm>100 )
{ unit[t].submenu1.h_alarm=30;}
if( unit[t].submenu1.bitTurns.turnsoflabsA<1||unit[t].submenu1.bitTurns.turnsoflabsA>5)
{ unit[t].submenu1.bitTurns.turnsoflabsA=1;}
if( unit[t].submenu1.bitTurns.turnsoflabsB<1||unit[t].submenu1.bitTurns.turnsoflabsB>5)
{ unit[t].submenu1.bitTurns.turnsoflabsB=1;}
}
for(t=0; t<MAXCNL_3K; t++)
{ checkbuffer[t].unitnumber=0;}
/*
发送0#询问命令
*/
for(t=0; t<MAXCNL_3K; t++)
{
smsg1.id=((int)t<<6);
smsg1.rtr=0;
smsg1.dlen=0;
CAN_SendMsg(smsg1);
}
#ifndef ST3000_TMODE
VarST3000.UnitActuals=0; // 默认为没有接收到通道
VarST3000.UnitCounts=0; // 重新累计
itimeouts=0; // can查询等待超时计数清零
delay(2000); // 2 seconds delay.
while( (VarST3000.UnitActuals<MAXCNL_3K) && (itimeouts<100000L) )
{
if( CAN_RecvMsg(&rmsg1) )
{
if( (rmsg1.id&0x3f)==0 )
{ // 0#命令
CtrlUnitIsOld=0; // 假设是个新单元
CtrlUnitID = (rmsg1.id>>6)&0x0F;
if(rmsg1.dlen!=3)
{ continue;}
if( (CtrlUnitID<1) || (CtrlUnitID>MAXCNL_3K) )
{ continue;}
// 在已有列表中查找是否存在这个单元
for(t=1; t<=VarST3000.UnitActuals; t++)
{
if( rmsg1.data[0]==checkbuffer[t].buffer[4] &&
rmsg1.data[1]==checkbuffer[t].buffer[5] &&
rmsg1.data[2]==checkbuffer[t].buffer[6] &&
CtrlUnitID==checkbuffer[t].unitnumber )
{ CtrlUnitIsOld=1; break;}
}
if( (!CtrlUnitIsOld) && rmsg1.data[0] )
{
VarST3000.UnitActuals++; // 第一个记录到数组下标1的位置 以此类推
checkbuffer[VarST3000.UnitActuals].buffer[3] =CtrlUnitID;
checkbuffer[VarST3000.UnitActuals].buffer[4] =rmsg1.data[0];
checkbuffer[VarST3000.UnitActuals].buffer[5] =rmsg1.data[1];
checkbuffer[VarST3000.UnitActuals].buffer[6] =rmsg1.data[2];
checkbuffer[VarST3000.UnitActuals].unitnumber=CtrlUnitID;
itimeouts=0L;
}
}
}
else
{ itimeouts++;}
}
#else
for(t=1; t<MAXCNL_3K; t++)
{
checkbuffer[t].buffer[3]=t;
checkbuffer[t].buffer[4]=10;
checkbuffer[t].buffer[5]=11;
checkbuffer[t].buffer[6]=t;
checkbuffer[t].unitnumber=t;
}
VarST3000.UnitActuals=10;
#endif
ReSortCURecv(); // 重新排序 20051010
VarST3000.UnitCounts=MAXCNL_3K; // 最大机组号显示
for(t=1; t<=VarST3000.UnitActuals; t++)
{
if( checkbuffer[t].buffer[3]!=system1[t].sub1.B4 ||
checkbuffer[t].buffer[4]!=system1[t].sub2.B1 ||
checkbuffer[t].buffer[5]!=system1[t].sub2.B2 ||
checkbuffer[t].buffer[6]!=system1[t].sub2.B3 )
{ CfgUpdate=1; break;}
}
InitialMouse();
Bar(0, 0, 1023, 767, 192, 192, 192);
if( VarST3000.Language )
{
ShowASCMemX(5, 19, 1, 2, "KESAI COLOR CON", 255, 255, 255);
ShowASCMemX(6, 20, 1, 2, "KESAI COLOR CON", 128, 128, 128);
}
else
{
ShowGB2312X(5, 19, 1, 2, "电脑套色", 255, 255, 255);
ShowGB2312X(6, 20, 1, 2, "电脑套色", 128, 128, 128);
}
if( CfgUpdate ) { SysConfirm();}
// A系属的命令设置
GetEntireIntelligent(1);
GetEntireAuto(1);
bEntireTurns=GetEntireTurns(1);
for(t=1; t<VarST3000.UnitCounts; t++)
{
if( unit[t].submenu1.unitworksnum.i==1 &&
unit[t].submenu1.unitworksnum.j )
{ ReUpdateCmd6(t, EntireStatus.EntireIntelligent_A, EntireStatus.EntireAuto_A, bEntireTurns);}
}
// B系属的命令设置
GetEntireIntelligent(2);
GetEntireAuto(2);
bEntireTurns=GetEntireTurns(2);
for(t=1; t<VarST3000.UnitCounts; t++)
{
if( unit[t].submenu1.unitworksnum.i==2 &&
unit[t].submenu1.unitworksnum.j )
{ ReUpdateCmd6(t, EntireStatus.EntireIntelligent_B, EntireStatus.EntireAuto_B, bEntireTurns);}
}
// 不归A系属和B系属
for(t=1; t<VarST3000.UnitCounts; t++)
{
if( !(unit[t].submenu1.unitworksnum.i && unit[t].submenu1.unitworksnum.j) )
{ memset(CommandData[t].Cmd6, 0, 7);}
}
#ifndef ST3000_TMODE
for(t=1; t<VarST3000.UnitCounts; t++)
{ SendCnlData(t, 0x07);} delay(30);
for(t=1; t<VarST3000.UnitCounts; t++)
{ SendCnlData(t, 0x08);} delay(30);
for(t=1; t<VarST3000.UnitCounts; t++)
{ SendCnlData(t, 0x09);} delay(30);
for(t=1; t<VarST3000.UnitCounts; t++)
{ SendCnlData(t, 0x0A);} delay(30);
for(t=1; t<VarST3000.UnitCounts; t++)
{ SendCnlData(t, 0x0B);} delay(30);
for(t=1; t<VarST3000.UnitCounts; t++)
{ SendCnlData(t, 0x06);}
#endif
}
/***
初始化界面扩展内存区
***/
void InitClientXms(void)
{
DWORD t,dwOffset=0L;
_fmemset(pdata1, 0xC0, 4096L);
for(t=0; t<700; t++)
{
CopyXMSMem((WORD)0, (DWORD)pdata1, 4096L, hClientXms, dwOffset);
dwOffset+=4096L;
}
_fmemset(pdata1, 0xFF, 4096L);
for(t=0, dwOffset=0L; t<200; t++)
{
CopyXMSMem((WORD)0, (DWORD)pdata1, 4096L, hWaveXms, dwOffset);
dwOffset+=4096L;
}
}
/***
系统主程序
***/
void main(void)
{
int ti;
unsigned nLeftXms;
WORD FreeXms;
if( (pdata1=(unsigned char far*)farmalloc(4096))==NULL )
{ printf("Failed allocate memory for 1st signal\n"); return;}
if( (pdata2=(unsigned char far*)farmalloc(4096))==NULL )
{ farfree(pdata1);
printf("Failed allocate memory for 2nd signal\n"); return;}
#ifndef ST3000_TMODE
/* 配置AD&CAN板
D7 1表示A系不报警; 0表示A系报警
D6 1表示B系不报警; 0表示B系报警
D5 1表示不采样波形; 0表示采样波形 [/ADE]
D4 1表示强制SJA1000复位
D3 1表示强制ADUC812复位
D2 先置低1ms,然后再置高,表示初始化完成; 1表示数据读完.[/END]
D1 1表示A系; 0表示B系
D0 1表示4000脉冲/圈; 0表示2000脉冲/圈.
*/
OUT7 =0xc0; //old is |=0xc0
outportb(0x302, OUT7);
OUT7 =0xd5; //1101 0101
outportb(0x302, OUT7);
delay(5);
OUT7 =0xf5; //1111 0101
outportb(0x302, OUT7);
delay(5);
OUT7 =0xd5;
outportb(0x302, OUT7);
delay(1);
OUT7|=0x10;
OUT7&=0xfb;
outportb(0x302, OUT7);
delay(100);
OUT7&=0xef;
OUT7|=0x04;
outportb(0x302, OUT7);
if( !CAN_Init(CAN1_IRQ) )
{ goto across_whilemain;}
if( !CAN_Config() )
{ goto across_whilemain;}
delay(100);
CAN_Run();
#endif
if( InitXMSMem() )
{
#ifdef ST3000_SCRXMS
nLeftXms=GetFreeXMSMem();
if( nLeftXms<3100 )
{ printf("XMS not enough!\n"); goto across_whilemain;}
hClientXms=AllocXMSMem(3100);
if( !hClientXms )
{ printf("Failed allocate XMS\n"); goto across_whilemain;}
nLeftXms=GetFreeXMSMem();
if( nLeftXms<850 )
{ printf("XMS not enough!\n"); goto across_whilemain;}
hWaveXms=AllocXMSMem(850);
if( !hWaveXms )
{ printf("Failed allocate XMS\n"); goto across_whilemain;}
#endif
}
else
{ printf("Failed Install XMS Driver\n"); goto across_whilemain;}
InitVESA();
SysInit();
HideMouse();
if( (lpImageData=(unsigned char far*)farmalloc(13824))==NULL )
{ goto across_whilemain;}
if( (lpImageMask=(unsigned char far*)farmalloc(576))==NULL )
{ goto across_whilemain;}
#ifdef ST3000_SCRXMS
InitClientXms();
/*
GetImage_xms(2, 70, 1020, 697, hClientXms, 0);
int v,h;
for(v=70; v<768; v++)
for(h=0; h<1024; h++)
PutPixel(h, v, 192, 192, 192);
Bar(9, 467, 1015, 670, 255, 255, 255);
GetImage_xms(9, 467, 1006, 203, hWaveXms, 0);
*/
#endif
VarST3000.CtrlMenuStatus=0; // 默认刚进入系统时 工程师控制菜单处于隐藏状态
ClearhjCNLFlags(); // 清除通道状态记录标志
ClearBuffers(); // 清除波形记录标志
// 初始化文件记录标志
VarST3000.FILE_REC=0x00; // 文件开始没有发生改变
tmsLastREC=time(NULL); // 记录一个有效的开始时间
EntireStatus.EntireYtzFlags=0x0000;
/*
清除整机工作状态标志
*/
ClearEntireFlags();
//___开始进入程序循环
VarST3000.AppAlive=1;
VarST3000.SubIDSEL=3;
VarST3000.MenuIDSEL=VarST3000.MenuIDSELOld=2;
ShowAllCtrlMenu(); //___Show AllCtrlMenu for User Operate.
//___resolved can message overflowed.
// main while loop routine.
while( VarST3000.AppAlive )
{
HideMouse();
ResetCtrlMenuFocus();
switch(VarST3000.MenuIDSEL)
{
case 1:
menu1();
break;
case 2:
menu2();
break;
case 3:
menu3();
break;
case 4:
menu4();
break;
case 5:
menu5();
break;
case 6:
menu6();
break;
case 7:
menu7();
break;
default:
break;
}
}
across_whilemain:
/*
关闭报警喇叭
*/
#ifndef ST3000_TMODE
OUT7|=0xc0;
outportb(0x302, OUT7);
#endif
for(ti=1; ti<VarST3000.UnitCounts; ti++)
{
CommandData[ti].Cmd6[1]&=0xf7; // 脱机工作
CommandData[ti].Cmd6[2]=0x00; // 本组和整机都是手动
CommandData[ti].Cmd6[6]&=0xdf; // 横向电机关闭
SendCnlData(ti, 0x06);
}
/*
正常释放资源数据
*/
ReleaseMouse();
farfree(lpImageData);
farfree(lpImageMask);
farfree(pdata1);
farfree(pdata2);
fclose(fpICO2424);
fclose(fpICO8840);
fclose(fpICO3232);
fclose(fpGB16);
// 将文件记录完全
// 存储文件(正常关机后下次访问依据的文件)
fseek(DataFile, 0, SEEK_SET);
fwrite(unit, sizeof(Units)*MAXCNL_3K, 1, DataFile);
fwrite(&SysSet, sizeof(SystemSettings), 1, DataFile);
fwrite(&Str6xtcs, sizeof(Str6xt), 1, DataFile);
fclose(DataFile);
//___存储文件(非正常关机后下次访问依据的文件) 暂时利用DataFile指针指向SysData.bak文件
DataFile=fopen("SysData.bak", "wb");
fseek(DataFile, 0, SEEK_SET);
fwrite(unit, sizeof(Units)*MAXCNL_3K, 1, DataFile);
fwrite(&SysSet, sizeof(SystemSettings), 1, DataFile);
fwrite(&Str6xtcs, sizeof(Str6xt), 1, DataFile);
fclose(DataFile);
//___存储版本文件 暂时利用DataFile指针指向KS.S文件
DataFile=fopen("KS.S", "rt+");
fwrite(&Edition3K, sizeof(tagVER), 1, DataFile);
fclose(DataFile);
//___释放为了刷屏而申请的内存区域
#ifdef ST3000_SCRXMS
FreeXMSMem(hClientXms);
hClientXms=0;
FreeXMSMem(hWaveXms);
hWaveXms=0;
#endif
//___对CAN进行复位
#ifndef ST3000_TMODE
//can0w(0, 1);
CAN_Exit(CAN1_IRQ);
#endif
//___从视频模式退出到文本DOS模式
EndVESA();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -