#include #include #include #include"..\lib\8000.h" #define DEBUG 1 char cCmd[80],cStr[80]; unsigned int V1, B11; unsigned long V21; /* ----------------------------------------------------- */ void main(void) { int quit=0; int data,i,j,start; int Len,slv,fun,addr_h,addr_l; InstallCom1(115200L,8,0); InstallCom3(19200L,8,0,1); ToCom1Str("Start "); V1=0; V21=12L; B11=0; for (;;) { if (IsCom3()) { i=ReadModbusSlave(cCmd,&Len,&slv,&fun,&addr_h,&addr_l); if (!i) { /* sprintf(cStr,"Len=%d, slv=%d, fun=%d, addr_h=%d, addr_l=%d", Len, slv, fun, addr_h, addr_l); ToCom1(' '); ToCom1('<'); ToCom1Str(cStr); ToCom1('>'); ToCom1(10); ToCom1(13); */ if (fun==1) fun_1(cCmd,Len,slv,addr_h,addr_l); else if (fun==3) fun_3(cCmd,Len,slv,addr_h,addr_l); else if (fun==5) fun_5(cCmd,Len,slv,addr_h,addr_l); else if (fun==16) fun_16(cCmd,Len,slv,addr_h,addr_l); else { sprintf(cStr,"Len=%d, slv=%d, fun=%d, addr_h=%d, addr_l=%d", Len, slv, fun, addr_h, addr_l); ToCom1(' '); ToCom1Str("***>"); ToCom1Str(cStr); ToCom1Str("<***"); ToCom1(10); ToCom1(13); } } else { sprintf(cStr,"ret=%d",i); ToCom1('<'); ToCom1Str(cStr); ToCom1('>'); ToCom1(10); ToCom1(13); } } if (IsCom1()) { data=ReadCom1(); if ((data=='q') || (data=='Q')) { RestoreCom1(); RestoreCom3(); return; } } } } /* ----------------------------------------------------- */ fun_1(char cCmd[], int len, int slv, int addr_h, int addr_l) { int nbi; nbi=cCmd[5]&0xff; if (DEBUG) { ToCom1('['); sprintf(cStr,"Fun1: len=%d, slv=%d, addr_h=%d, addr_l=%d", len, slv, addr_h, addr_l); ToCom1Str(cStr); sprintf(cStr," *** nbi=%d",nbi); ToCom1Str(cStr); ToCom1(']'); ToCom1(10); ToCom1(13); } if (nbi==16) { cCmd[2]=2; // nbb= 2 if (B11) { cCmd[3]=0xff;// V0 cCmd[4]=0xff;// V1 } else { cCmd[3]=0; // V0 cCmd[4]=0; // V1 } } AnswerModbusSlave(cCmd,5); } /* ----------------------------------------------------- */ fun_3(char cCmd[], int len, int slv, int addr_h, int addr_l) { int nbw,h,l; unsigned int addr; unsigned long ll; nbw=cCmd[5]&0xff; if (DEBUG) { ToCom1('['); sprintf(cStr,"Fun3: len=%d, slv=%d, addr_h=%d, addr_l=%d", len, slv, addr_h, addr_l); ToCom1Str(cStr); sprintf(cStr," *** nbw=%d",nbw); ToCom1Str(cStr); ToCom1(']'); ToCom1(10); ToCom1(13); } addr=addr_h*256+addr_l; if (addr==1) { h=V1; l=h&0xff; h=h>>8; h=h&0xff; cCmd[2]=2; // nbb= 2 cCmd[3]=h; // VH cCmd[4]=l; // VL AnswerModbusSlave(cCmd,5); return; } else if (addr==21) { cCmd[2]=4; // nbb= 4 ll=V21; l=ll&0xff;ll=ll>>8; cCmd[4]=l; // VL l=ll&0xff;ll=ll>>8; cCmd[3]=l; // VH l=ll&0xff;ll=ll>>8; cCmd[6]=l; // VL l=ll&0xff;ll=ll>>8; cCmd[5]=l; // VH AnswerModbusSlave(cCmd,7); return; } } /* ----------------------------------------------------- */ fun_5(char cCmd[], int len, int slv, int addr_h, int addr_l) { int nbw,V; unsigned int addr; V=cCmd[4]&0xff; if (DEBUG) { ToCom1('['); sprintf(cStr,"Fun5: len=%d, slv=%d, addr_h=%d, addr_l=%d", len, slv, addr_h, addr_l); ToCom1Str(cStr); if (V) sprintf(cStr," *** V=%d , TRUE",V); else sprintf(cStr," *** V=FALSE"); ToCom1Str(cStr); ToCom1(']'); ToCom1(10); ToCom1(13); } addr=addr_h*256+addr_l; if (addr==11) { if (V) B11=1; else B11=0; } AnswerModbusSlave(cCmd,6); } /* ----------------------------------------------------- */ fun_16(char cCmd[], int len, int slv, int addr_h, int addr_l) { int nbw,nbb; unsigned int addr; nbw=cCmd[5]&0xff; nbb=cCmd[6]&0xff; if (DEBUG) { ToCom1('['); sprintf(cStr,"Fun16: len=%d, slv=%d, addr_h=%d, addr_l=%d", len, slv, addr_h, addr_l); ToCom1Str(cStr); sprintf(cStr," *** nbw=%d , nbb=%d",nbw,nbb); ToCom1Str(cStr); sprintf(cStr,",%x,%x,%x,%x",cCmd[7],cCmd[8],cCmd[9],cCmd[10]); ToCom1Str(cStr); ToCom1(']'); ToCom1(10); ToCom1(13); } addr=addr_h*256+addr_l; if (addr==1) { V1=(cCmd[7]&0xff)*256+(cCmd[8]&0xff); } else if (addr==21) { V21=(long)(cCmd[9]&0xff)*256L*256L*256L+(long)(cCmd[10]&0xff)*256L*256L+ (long)(cCmd[7]&0xff)*256L+(long)(cCmd[8]&0xff); } AnswerModbusSlave(cCmd,6); }