ComWincc

所属分类:Windows编程
开发工具:Visual C++
文件大小:77KB
下载次数:41
上传日期:2007-04-19 14:54:10
上 传 者meijie111
说明:  利用VC编写的关于配料的动态库程序,可供Wincc动态调用,现在已经在生产现场应用。
(VC ingredients prepared on the procedures for the dynamic for Wincc dynamic invocation, Now the scene has been in production use.)

文件列表:
Comm注释版.cpp (37046, 2006-12-04)
Comm.cpp (39616, 2007-01-30)
Data.cpp (6240, 2005-09-01)
StdAfx.cpp (291, 2002-11-08)
t1.cpp (0, 2005-10-27)
修改Comm.cpp (12201, 2006-08-25)
Comm.def (469, 2006-12-17)
COMM.PLG (5656, 2007-01-30)
COMM.NCB (238592, 2007-04-08)
comm.opt (74752, 2007-04-08)
comm.dsp (4581, 2007-01-29)
COMM.DSW (531, 2002-11-08)
COMM.H (800, 2002-11-08)
StdAfx.h (802, 2002-11-08)

======================================================================== DYNAMIC LINK LIBRARY : comm ======================================================================== AppWizard has created this comm DLL for you. This file contains a summary of what you will find in each of the files that make up your comm application. comm.dsp This file (the project file) contains information at the project level and is used to build a single project or subproject. Other users can share the project (.dsp) file, but they should export the makefiles locally. comm.cpp This is the main DLL source file. comm.h This file contains your DLL exports. ///////////////////////////////////////////////////////////////////////////// Other standard files: StdAfx.h, StdAfx.cpp These files are used to build a precompiled header (PCH) file named comm.pch and a precompiled types file named StdAfx.obj. ///////////////////////////////////////////////////////////////////////////// Other notes: AppWizard uses "TODO:" to indicate parts of the source code you should add to or customize. ///////////////////////////////////////////////////////////////////////////// // comm.cpp : Defines the entry point for the DLL application. #include "stdafx.h" #include "comm.h" #include "stdio.h" #include "stdlib.h" #include "math.h" int ExecSQL(char *SqlText); int SelectSQL(char *SqlText, int n, char Ret[][200], int *RowCount); int SaveData(int k); int GetPF(char *pfbh, float pzl); struct PF{ int xh; int ch; int jlh; char mc[30]; float bl; float llz; long hh; float tql; float tql0; float sjz; float csz; float xsz; } pf1[5][7],pf2[5][7],pf3[5][7],pf4[5][7],pf5[5][7]; static int end1[5],end2[5],end3[5],end4[5],end5[5], ppend; static int start1, pover1, pl1 ,pp, stch[6]; static int start2, pover2, pl2; static int start3, pover3, pl3; static int start4, pover4, pl4; static int start5, pover5, pl5; static float w_jcz1, ybwc1, bpz1; static float w_jcz2, ybwc2, bpz2; static float w_jcz3, ybwc3, bpz3; static float w_jcz4, ybwc4, bpz4; static float w_jcz5, ybwc5, bpz5; static int fl_n1,fl_n2,fl_n3,fl_n4,fl_n5; static int fl_end1,fl_end2,fl_end3,fl_end4,fl_end5; static float pzl; static int scpf_XH=1, hfjh, hhsj; char pfbh[10],pfmc[30]; static BOOL tql_chk=0, tql_mod=0; HANDLE m_hComFile; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } //================================================= void delay(long DealyTime) { SYSTEMTIME sysTime; long End_time, Start_time; GetLocalTime(&sysTime); Start_time= (sysTime.wHour*3600 + sysTime.wMinute*60 + sysTime.wSecond)*1000 + sysTime.wMilliseconds; End_time=Start_time; while((End_time-Start_time) < DealyTime) { GetLocalTime(&sysTime); End_time= (sysTime.wHour*3600 + sysTime.wMinute*60 + sysTime.wSecond)*1000 + sysTime.wMilliseconds; } } //================================================= int CloseCom(void) { if(m_hComFile==0)return 0; CloseHandle(m_hComFile); m_hComFile=0; return 0; } //================================================= int SetCom(char *comport) { DCB dcb ; //定义设备控制块结构 COMMTIMEOUTS timeouts ; //定义超时结构,并填写该结构 char Msg[30]; /*1. 打开串行通信设备。在VC中使用CreateFile函数打开串口,CreateFile将返回串口的句柄。 该句柄将被用于后续的通信操作,并贯穿整个通信过程。当采用异步方式时, CreateFile函数的参数fdwAttrsAndFlags必须设为FILE_FLAG_ OVERLAPPED*/ m_hComFile =CreateFile(comport, GENERIC_READ | GENERIC_WRITE, // 允许读写操作 0, //此项必须为0 NULL, // 安全设置 OPEN_EXISTING, //设置打开方式 FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,//FILE_FLAG_OVERLAPPED, //使用异步通信标志 FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED NULL ); strcpy(Msg,comport); strcat(Msg, "通信口打开错误!"); if(m_hComFile<=0) { MessageBox(NULL,"错误信息",Msg,MB_OK); return 1; } /*2. 指定并初始化读写缓冲区。程序通过调用SetupComm函数来指定读写缓冲区的大小, 并执行重新分配内部输入和输出缓冲的任务,用PurgeComm函数对输入和输出缓冲进行初始化*/ //设置事件驱动的类型 SetCommMask(m_hComFile, EV_RXCHAR | EV_TXEMPTY ); //设置输入、输出缓冲区的大小 SetupComm(m_hComFile, 1024,1024) ; //清空输入、输出缓冲区 PurgeComm(m_hComFile, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); /*3.设置串口属性,配置DCB结构。当用CreateFile函数完成串口打开操作时, 默认继承设备控制块(DCB结构)设置。通过调用GetCommState函数读取当前串口设备控制块DCB设置, 修改后通过SetCommState函数将其写入。也可以使用GetCommProperties获取COMMPROP结构, 其中记载了系统支持的各项设置,包括当前所使用的串行设备、数据传输波特率、输入输出缓冲区大小等。*/ GetCommState(m_hComFile, &dcb ) ; //读取串口原来的参数设置 dcb.BaudRate =9600; dcb.ByteSize =7; dcb.Parity = EVENPARITY; dcb.StopBits = ONESTOPBIT ; //dcb.fBinary = TRUE ; //dcb.fParity = FALSE; SetCommState(m_hComFile, &dcb ) ; //串口参数配置 /*4. 设置超时值。串口打开后,I/O操作的超时值采用默认值。超时值的设置与结构COMMTIMEOUTS及 函数GetCommTimeouts和SetCommTimeouts有关。用GetCommTimeouts函数可以获得当前I/O操作的超时 值配置,而调用SetCommTimeouts函数可以修改此配置,*/ timeouts.ReadIntervalTimeout = 1000; timeouts.ReadTotalTimeoutMultiplier = 100; timeouts.ReadTotalTimeoutConstant = 3000; timeouts.WriteTotalTimeoutMultiplier = 1; timeouts.WriteTotalTimeoutConstant=2000; SetCommTimeouts(m_hComFile, &timeouts); //设置读写操作所允许的超时 /*其中,区间超时(ReadIntervalTimeout)指的是在读取两个字符之间的时间间隔,它仅对从端口中 读取数据有效;总超时指的是当读或写特定的字节数需要的总时间超过某一阈值时,超时触发。 超时的计算公式如下: ReadTotalTimeout= (ReadTotalTimeoutMultiplier * bytes_to_read)+ ReadToTaltimeoutConstant WriteTotalTimeout = (WriteTotalTimeoutMuliplier * bytes_to_write) + WritetoTotalTimeoutConstant */ return 0; } //===================================================== int yb_tx(char *ComSend, char *ComRecceive, long delaytime) { BOOL fWriteStat; OVERLAPPED overwrite,overread; BOOL fReadStat; DWORD dwBytesToWrite, dwBytesWritten; DWORD dwLength,dwBytesRead; char lpBuffer[5]; long k=0, ErrCode=0; if(m_hComFile==0) { // MessageBox(NULL,"通信口没有打开!","错误信息",MB_OK); return 1; } // *ComSend 存放待发送的数据 //清空输入、输出缓冲区 PurgeComm(m_hComFile, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); /*5. 进行串行数据通信。调用函数ReadFile和WriteFile读写串口。若采用异步通信方式, 两函数中最后一个参数为指向OVERLAPPED结构的非空指针,在读写函数返回值为FALSE的情况下, 调用GetLastError函数,返回值为ERROR_IO_PENDING,表明I/O操作悬挂,即操作转入后台继续执行。 此时,可以用WaitForSingleObject函数来等待结束信号并设置最长等待时间。下面的例子中, 在主线程中发送命令,用一个辅助线程来监视串口,有数据到达时依靠事件驱动读入数据并向主线程报告。*/ //设置用于异步操作的OVERLAPPED结构 overwrite.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); //写数据 dwBytesToWrite=strlen(ComSend); //要发送的数据的长度 fWriteStat = WriteFile(m_hComFile, ComSend, dwBytesToWrite, &dwBytesWritten, &overwrite); if (!fWriteStat){ if (GetLastError() == ERROR_IO_PENDING) {//MessageBox(NULL,"发送数据错误!","错误信息",MB_OK); } } //延时读 delay(delaytime); //读数据 overread.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); dwLength=1; lpBuffer[0]=0; ComRecceive[0]=0; while(lpBuffer[0]!=10) { k++; fReadStat = ReadFile(m_hComFile,lpBuffer,dwLength, &dwBytesRead,&overread); if (!fReadStat){ if (GetLastError() == ERROR_IO_PENDING) { // MessageBox(NULL,"未接收到数据,请加大延时时间","错误信息",MB_OK); } } if(k>100) break; if(dwBytesRead>0) { lpBuffer[1]=0; strcat(ComRecceive,lpBuffer); } } //MessageBox(NULL,ComRecceive,"已经接收的数据",MB_OK); return 0; } //============================================= int yb_read(int id, double *zl) { char yb_id[]={5,'I','D','1','8',13,10,0}; char yb_send[]={'R','E','A','D',13,10,0}; char yb_out[30]; int len; if(id==2)yb_id[3]='2'; if(id==3)yb_id[3]='3'; if(id==4)yb_id[3]='4'; if(id==5)yb_id[3]='5'; yb_tx(yb_id, yb_out,100); yb_tx(yb_send, yb_out,100); len=strlen(yb_out); yb_out[len-4]=0; *zl=atof(&yb_out[7]); if(yb_out[6]=='-') *zl=-(*zl); return 0; } //============================================= int yb_write(int id, long yb_hh, long yb_hi, long yb_ll) { char yb_set0[]={5,'I','D','1','8',13,10,0}; char yb_set1[11][20]; char crlf[3]={13,10,0}; char yb_out[30]; int k, Ret; long yb_lo; char ss[50]; if(id==2)yb_set0[3]='2'; if(id==3)yb_set0[3]='3'; if(id==4)yb_set0[3]='4'; if(id==5)yb_set0[3]='5'; if(yb_ll<0) yb_ll=0; if(yb_hi1 || tql_chk==0) { //读仪表 yb_read(ybid, &zl); pf0[*start0].csz=(float)zl; //设置仪表的目标数据 hh=(long)((pf0[*start0].csz+pf0[*start0].llz-pf0[*start0].tql)*jd); pf0[*start0].hh=hh; hi=hh-(long)(bpz0*jd); ll=(long)(ybwc0*jd); mm=yb_write(ybid, hh , hi, ll); if(mm==1) { MessageBox(NULL,"数据设置错误","ASFSDAF",MB_OK); return; } //正在配料 *pl0=1; //启动绞龙 *stch0=pf0[*start0].jlh; *ybset=1; return ; } } //---------如果配料绞龙停 if( *stch0==0 && (*pl0==1 || *pl0==2)) { //读仪表 yb_read(ybid, &zl); //第二批以后最后一个下料仓或不检测提前量的任意批的最后一个下料仓 if(*start0 == end0 && (p0>1 || tql_chk==0)) { pf0[*start0].sjz = (float)zl-pf0[*start0].csz; pf0[*start0].xsz = (float)zl-pf0[*start0].sjz; //存储实际值 SaveData(ybid); //下一批的提前量 if(tql_mod==1) pf0[*start0].tql= ((float)(zl-pf0[*start0].hh/jd) + pf0[*start0].tql)/2; *pl0=0; *pover=1; //此秤配料完成 sprintf(ss,"批次=%d start0=%d end0=%d", p0, *start0, end0); MessageBox(NULL,ss,"此秤配料完成!",MB_OK); return; } if( (*start0 < end0) || (*start0 == end0 && p0==1 && tql_chk)) { //设置仪表的目标数据 if(*pl0==1) //如果是第二批以后则start0+1 { //实际值 pf0[*start0].sjz = (float)zl-pf0[*start0].csz; pf0[*start0].xsz = (float)zl-pf0[*start0].sjz; //存储实际值 SaveData(ybid); //下一批的提前量 if(tql_mod==1) pf0[*start0].tql= ((float)(zl-pf0[*start0].hh/jd) + pf0[*start0].tql)/2; *start0=*start0+1; pf0[*start0].csz = (float)zl; } hh=(long)((pf0[*start0].csz+pf0[*start0].llz-pf0[*start0].tql)*jd); pf0[*start0].hh=hh; hi=(long)(hh-bpz0*jd); ll=(long)(ybwc0*jd); mm=yb_write(ybid, hh, hi, ll); if(mm==1) { MessageBox(NULL,"数据设置错误","错误信息",MB_OK); return; } //正在配料 if(*pl0==2) *pl0=3; //启动绞龙 *stch0=pf0[*start0].jlh; *ybset=1; } } //-----------停绞龙处理完毕 } //============================== void pp_init(void) { fl_n1=1; fl_n2=1; fl_n3=1; fl_n4=1; fl_n5=1; pover1=0; pover2=0; pover3=0; pover4=0; pover5=0; start1=1; start2=1; start3=1; start4=1; start5=1; pl1=0; pl2=0; pl3=0; pl4=0; pl5=0; } //==================================================== int pl_init(int scxh) { char txtSQL[200]; char ss[200]; int RowCount; char Ret[50][200]; int mm; strcpy(txtSQL,"SELECT pfbh, pfmc, ps, pzl, hhsj, hfjh from scpf where xh="); sprintf(ss, "%d", scxh); strcat(txtSQL, ss); strcat(txtSQL, " order by xh"); mm = SelectSQL(txtSQL, 6, Ret, &RowCount); if(RowCount==0) { MessageBox(NULL,"全部生产完毕","提示信息",MB_OK); return 1; } sscanf(Ret[1],"%s%s%d%f%d%d", pfbh,pfmc,&ppend,&pzl,&hhsj,&hfjh); fl_n1=1; fl_n2=1; fl_n3=1; fl_n4=1; fl_n5=1; //每批开始前的初始化 pp_init(); //得到系统参数 //料柱检测设置值 w_jcz1=(float)1; w_jcz2=(float)1; w_jcz3=(float)2; w_jcz4=(float)2; w_jcz5=(float)2; //仪表低低限,变频值 ybwc1=0.25; bpz1=2; ybwc2=0.25; bpz2=2; ybwc3=0.5; bpz3=5; ybwc4=0.5; bpz4=5; ybwc5=0.5; bpz5=5; //取配方数据 pp=1; //从第一批开始 //从生产配方库中得到生产配方 // ppend=1; //生产批次 // strcpy(pfbh,"0002"); //配方编号 // strcpy(pfmc,"配方2"); //配方名称 // pzl=100/100; //每批重量 // hfjh=12; //混合机号 // hhsj=10; //混合时间 //得到配方数据 GetPF(pfbh, pzl); return 0; } //==================================================== void dispdata(char ylname[31][20], float llz[31], float xszl[31]) { int k; for(k=1;k<31;k++) { strcpy(ylname[k],""); llz[k]=0; xszl[k]=0; } for(k=1;k<=end1[fl_n1];k++) { strcpy(ylname[k],pf1[fl_n1][k].mc); llz[k]=pf1[fl_n1][k].llz; xszl[k]=pf1[fl_n1][k].xsz; } for(k=1;k<=end2[fl_n2];k++) { strcpy(ylname[k+6],pf2[fl_n2][k].mc); llz[k+6]=pf2[fl_n2][k].llz; xszl[k+6]=pf2[fl_n2][k].xsz; } for(k=1;k<=end3[fl_n3];k++) { strcpy(ylname[k+12],pf3[fl_n3][k].mc); llz[k+12]=pf3[fl_n3][k].llz; xszl[k+12]=pf3[fl_n3][k].xsz; } for(k=1;k<=end4[fl_n4];k++) { strcpy(ylname[k+18],pf4[fl_n4][k].mc); llz[k+18]=pf4[fl_n4][k].llz; xszl[k+18]=pf4[fl_n4][k].xsz; } for(k=1;k<=end5[fl_n5];k++) { strcpy(ylname[k+24],pf5[fl_n5][k].mc); llz[k+24]=pf5[fl_n5][k].llz; xszl[k+24]=pf5[fl_n5][k].xsz; } } //==================================================== //kypl:==0:允许配料(PLC-->WCC),=1:正在卸料不允许配料(PLC<--WCC) //stch0:不为0表示要启动的绞龙号(WCC-->PLC),==0 绞龙停(WCC<--PLC) void pl_loop(int stch0[10], int kypl[10], int *pstart, double ybshow[10], int ybset[10], int pover[10], int StartPL) { char ss[100]; int k,j; yb_read(1, &ybshow[1]); yb_read(2, &ybshow[2]); yb_read(3, &ybshow[3]); yb_read(4, &ybshow[4]); yb_read(5, &ybshow[5]); if(StartPL==0) return; if(stch0[1]!=0 && kypl[1]==0) pf1[fl_n1][start1].xsz = (float)ybshow[1]-pf1[fl_n1][start1].csz; if(stch0[2]!=0 && kypl[2]==0) pf2[fl_n2][start2].xsz = (float)ybshow[2]-pf2[fl_n2][start2].csz; if(stch0[3]!=0 && kypl[3]==0) pf3[fl_n3][start3].xsz = (float)ybshow[3]-pf3[fl_n3][start3].csz; if(stch0[4]!=0 && kypl[4]==0) pf4[fl_n4][start4].xsz = (float)ybshow[4]-pf4[fl_n4][start4].csz; if(stch0[5]!=0 && kypl[5]==0) pf5[fl_n5][start5].xsz = (float)ybshow[5]-pf5[fl_n5][start5].csz; if(kypl[1]==0 && end1[fl_n1]>0 && pover1==0) { ppll(1, pf1[fl_n1], &start1, end1[fl_n1], ybwc1, bpz1, pp, &stch0[1], &pl1, &pover[1], w_jcz1,1000, &ybset[1]); if(fl_n1==fl_end1 && pover[1]==1) pover1=1; if(pover[1]==1 && fl_n10 && pover2==0) { ppll(2, pf2[fl_n2], &start2, end2[fl_n2], ybwc2, bpz2, pp, &stch0[2], &pl2, &pover[2], w_jcz2,1000, &ybset[2]); if(fl_n2==fl_end2 && pover[2]==1) pover2=1; if(pover[2]==1 && fl_n20 && pover3==0) { ppll(3, pf3[fl_n3], &start3, end3[fl_n3], ybwc3, bpz3, pp, &stch0[3], &pl3, &pover[3], w_jcz3,100, &ybset[3]); if(fl_n3==fl_end3 && pover[3]==1) pover3=1; if(pover[3]==1 && fl_n30 && pover4==0) { ppll(4, pf4[fl_n4], &start4, end4[fl_n4], ybwc4, bpz4, pp, &stch0[4], &pl4, &pover[4], w_jcz4,100, &ybset[4]); if(fl_n4==fl_end4 && pover[4]==1) pover4=1; if(pover[4]==1 && fl_n40 && pover5==0) { ppll(5, pf5[fl_n5], &start5, end5[fl_n5], ybwc5, bpz5, pp, &stch0[5], &pl5, &pover[5], w_jcz5,100, &ybset[5]); if(fl_n5==fl_end5 && pover[5]==1) pover5=1; if(pover[5]==1 && fl_n5 ... ...

近期下载者

相关文件


收藏者