void read_user(unsigned char plc_addr,unsigned char addr,unsigned char cnt) { unsigned short crc_val; unsigned char* tx_buf; if((unsigned short)addr+(unsigned short)cnt > 256) {rx_mod_cnt=0;return;} tx_buf=get_can_tx_ptr(3); tx_buf[0]=plc_addr; tx_buf[1]=0xD0; tx_buf[2]=addr; tx_buf[3]=cnt; crc_val=GetCRC16(tx_buf,4); tx_buf[4]=crc_val>>8; tx_buf[5]=crc_val&0xFF; write_module(6); }
void read_xram_51(unsigned char plc_addr,unsigned short xram_addr) { unsigned short crc_val; unsigned char* tx_buf; tx_buf = get_can_tx_ptr(3); if(tx_buf==0) return; tx_buf[0]=plc_addr; tx_buf[1]=0xD4; tx_buf[2]=xram_addr >> 8; tx_buf[3]=xram_addr & 0xFF; crc_val=GetCRC16(tx_buf,4); tx_buf[4]=crc_val>>8; tx_buf[5]=crc_val&0xFF; write_module(6); }
void exchange_work(void) { if(EXCHANGE) { exch_tmr++; if(exch_tmr>=50) { exch_tmr=0; switch(exch_step) { case 0x00: exch_step++; if(START_P1) { tx_mod_buf[0]=0x01;tx_mod_buf[1]=0xE5;tx_mod_buf[2]=_Sys.Adr; for(temp=0;temp<64;temp++) tx_mod_buf[3+temp]=TX_1[temp]; temp=GetCRC16(tx_mod_buf,67);tx_mod_buf[67]=temp>>8;tx_mod_buf[68]=temp&0xFF; write_module(69);PLC1++;if(((PLC1%4)==0)&&(ERR1<255)) ERR1++;break; } case 0x01: exch_step++; if(START_P2) { tx_mod_buf[0]=0x02;tx_mod_buf[1]=0xE5;tx_mod_buf[2]=_Sys.Adr; for(temp=0;temp<64;temp++) tx_mod_buf[3+temp]=TX_2[temp]; temp=GetCRC16(tx_mod_buf,67);tx_mod_buf[67]=temp>>8;tx_mod_buf[68]=temp&0xFF; write_module(69);PLC2++;if(((PLC2%4)==0)&&(ERR2<255)) ERR2++;break; } case 0x02: exch_step++; if(START_P3) { tx_mod_buf[0]=0x03;tx_mod_buf[1]=0xE5;tx_mod_buf[2]=_Sys.Adr; for(temp=0;temp<64;temp++) tx_mod_buf[3+temp]=TX_3[temp]; temp=GetCRC16(tx_mod_buf,67);tx_mod_buf[67]=temp>>8;tx_mod_buf[68]=temp&0xFF; write_module(69);PLC3++;if(((PLC3%4)==0)&&(ERR3<255)) ERR3++;break; } case 0x03: exch_step++; if(START_P4) { tx_mod_buf[0]=0x04;tx_mod_buf[1]=0xE5;tx_mod_buf[2]=_Sys.Adr; for(temp=0;temp<64;temp++) tx_mod_buf[3+temp]=TX_4[temp]; temp=GetCRC16(tx_mod_buf,67);tx_mod_buf[67]=temp>>8;tx_mod_buf[68]=temp&0xFF; write_module(69);PLC4++;if(((PLC4%4)==0)&&(ERR4<255)) ERR4++;break; } case 0x04: exch_step++; if(START_P5) { tx_mod_buf[0]=0x05;tx_mod_buf[1]=0xE5;tx_mod_buf[2]=_Sys.Adr; for(temp=0;temp<64;temp++) tx_mod_buf[3+temp]=TX_5[temp]; temp=GetCRC16(tx_mod_buf,67);tx_mod_buf[67]=temp>>8;tx_mod_buf[68]=temp&0xFF; write_module(69);PLC5++;if(((PLC5%4)==0)&&(ERR5<255)) ERR5++;break; } case 0x05: exch_step++; if(START_P6) { tx_mod_buf[0]=0x06;tx_mod_buf[1]=0xE5;tx_mod_buf[2]=_Sys.Adr; for(temp=0;temp<64;temp++) tx_mod_buf[3+temp]=TX_6[temp]; temp=GetCRC16(tx_mod_buf,67);tx_mod_buf[67]=temp>>8;tx_mod_buf[68]=temp&0xFF; write_module(69);PLC6++;if(((PLC6%4)==0)&&(ERR6<255)) ERR6++;break; } case 0x06: exch_step++; if(START_P7) { tx_mod_buf[0]=0x07;tx_mod_buf[1]=0xE5;tx_mod_buf[2]=_Sys.Adr; for(temp=0;temp<64;temp++) tx_mod_buf[3+temp]=TX_7[temp]; temp=GetCRC16(tx_mod_buf,67);tx_mod_buf[67]=temp>>8;tx_mod_buf[68]=temp&0xFF; write_module(69);PLC7++;if(((PLC7%4)==0)&&(ERR7<255)) ERR7++;break; } case 0x07: exch_step=0; if(START_P8) { tx_mod_buf[0]=0x08;tx_mod_buf[1]=0xE5;tx_mod_buf[2]=_Sys.Adr; for(temp=0;temp<64;temp++) tx_mod_buf[3+temp]=TX_8[temp]; temp=GetCRC16(tx_mod_buf,67);tx_mod_buf[67]=temp>>8;tx_mod_buf[68]=temp&0xFF; write_module(69);PLC8++;if(((PLC8%4)==0)&&(ERR8<255)) ERR8++;break; } exch_step++; if(START_P1) { tx_mod_buf[0]=0x01;tx_mod_buf[1]=0xE5;tx_mod_buf[2]=_Sys.Adr; for(temp=0;temp<64;temp++) tx_mod_buf[3+temp]=TX_1[temp]; temp=GetCRC16(tx_mod_buf,67);tx_mod_buf[67]=temp>>8;tx_mod_buf[68]=temp&0xFF; write_module(69);PLC1++;if(((PLC1%4)==0)&&(ERR1<255)) ERR1++; } break; } } }
void can_cmd(request* r) { unsigned short crc_val,tmp; unsigned char* tx_buf; tx_buf = get_can_tx_ptr(r->canal); if(tx_buf==0) return; switch(r->cmd) { case WR_RAM: tx_buf[0]=r->plc_addr; tx_buf[1]=0xE4; tx_buf[2]=r->mem_addr >> 8; tx_buf[3]=r->mem_addr & 0xFF; tx_buf[4]=r->amount >> 8; tx_buf[5]=r->amount & 0xFF; for(tmp=0;tmp < r->amount;tmp++) tx_buf[6+tmp]=r->tx[tmp]; crc_val=GetCRC16(tx_buf,6+tmp); tx_buf[6+tmp]=crc_val>>8; tx_buf[7+tmp]=crc_val&0xFF; clear_rx_cnt(r->canal); switch(r->canal) { case 1:write_canal2(8+tmp);break; case 2:write_canal(8+tmp);break; case 3:write_module(8+tmp);break; } break; case WR_US: tx_buf[0]=r->plc_addr; tx_buf[1]=0xE0; tx_buf[2]=r->mem_addr & 0xFF; tx_buf[3]=r->amount & 0xFF; for(tmp=0;tmp < r->amount;tmp++) tx_buf[4+tmp]=r->tx[tmp]; crc_val=GetCRC16(tx_buf,4+tmp); tx_buf[4+tmp]=crc_val>>8; tx_buf[5+tmp]=crc_val&0xFF; clear_rx_cnt(r->canal); switch(r->canal) { case 1:write_canal2(6+tmp);break; case 2:write_canal(6+tmp);break; case 3:write_module(6+tmp);break; } break; case WR_XRAM: tx_buf[0]=r->plc_addr; tx_buf[1]=0x64; tx_buf[2]=r->mem_addr >> 8; tx_buf[3]=r->mem_addr & 0xFF; for(tmp=0;tmp < r->amount;tmp++) tx_buf[4+tmp]=r->tx[tmp]; crc_val=GetCRC16(tx_buf,4+tmp); tx_buf[4+tmp]=crc_val>>8; tx_buf[5+tmp]=crc_val&0xFF; clear_rx_cnt(r->canal); switch(r->canal) { case 1:write_canal2(6+tmp);break; case 2:write_canal(6+tmp);break; case 3:write_module(6+tmp);break; } break; case WR_REG: if((r->amount >= 128)||(r->amount == 0)) break; tx_buf[0]=r->plc_addr; tx_buf[1]=0x10; tx_buf[2]=r->mem_addr >> 8; tx_buf[3]=r->mem_addr & 0xFF; tx_buf[4]=0; tx_buf[5]=r->amount; tx_buf[6]=r->amount*2; for(tmp=0;tmp<r->amount;tmp++) { tx_buf[7+tmp*2]=r->tx[tmp*2+1]; tx_buf[8+tmp*2]=r->tx[tmp*2]; } tx_buf[7+r->amount*2]=getLRC(tx_buf,7+r->amount*2); switch(r->canal) { case 1: mstr2=0x10; write_canal2(bin_to_ascii(tx_buf,8+r->amount*2,_MODBUS)); break; case 2: mstr1=0x10; write_canal(bin_to_ascii(tx_buf,8+r->amount*2,_MODBUS)); break; } break; case WR_HLD: if((r->amount >= 128)||(r->amount == 0)) break; tx_buf[0]=r->plc_addr; tx_buf[1]=0x10; tx_buf[2]=r->mem_addr >> 8; tx_buf[3]=r->mem_addr & 0xFF; tx_buf[4]=0; tx_buf[5]=r->amount; tx_buf[6]=r->amount*2; for(tmp=0;tmp<r->amount;tmp++) { tx_buf[7+tmp*2]=r->tx[tmp*2+1]; tx_buf[8+tmp*2]=r->tx[tmp*2]; } crc_val=GetCRC16(tx_buf,7+r->amount*2); tx_buf[7+r->amount*2]=crc_val>>8; tx_buf[8+r->amount*2]=crc_val&0xFF; clear_rx_cnt(r->canal); switch(r->canal) { case 1:write_canal2(9+r->amount*2);break; case 2:write_canal(9+r->amount*2);break; case 3:write_module(9+r->amount*2);break; } break; case WR_COIL: tx_buf[0]=r->plc_addr; tx_buf[1]=0x05; tx_buf[2]=r->mem_addr >> 8; tx_buf[3]=r->mem_addr & 0xFF; if(r->tx[0]) { tx_buf[4]=0xFF; tx_buf[5]=0; } else { tx_buf[4]=0; tx_buf[5]=0; } crc_val=GetCRC16(tx_buf,6); tx_buf[6]=crc_val>>8; tx_buf[7]=crc_val&0xFF; clear_rx_cnt(r->canal); switch(r->canal) { case 1:write_canal2(8);break; case 2:write_canal(8);break; case 3:write_module(8);break; } break; case RD_RAM: tx_buf[0]=r->plc_addr; tx_buf[1]=0xD4; tx_buf[2]=r->mem_addr >> 8; tx_buf[3]=r->mem_addr & 0xFF; tx_buf[4]=r->amount >> 8; tx_buf[5]=r->amount & 0xFF; crc_val=GetCRC16(tx_buf,6); tx_buf[6]=crc_val>>8; tx_buf[7]=crc_val&0xFF; clear_rx_cnt(r->canal); switch(r->canal) { case 1:write_canal2(8);break; case 2:write_canal(8);break; case 3:write_module(8);break; } break; case RD_US: tx_buf[0]=r->plc_addr; tx_buf[1]=0xD0; tx_buf[2]=r->mem_addr & 0xFF; tx_buf[3]=r->amount & 0xFF; crc_val=GetCRC16(tx_buf,4); tx_buf[4]=crc_val>>8; tx_buf[5]=crc_val&0xFF; clear_rx_cnt(r->canal); switch(r->canal) { case 1:write_canal2(6);break; case 2:write_canal(6);break; case 3:write_module(6);break; } break; case RD_XRAM: tx_buf[0]=r->plc_addr; tx_buf[1]=0x54; tx_buf[2]=r->mem_addr >> 8; tx_buf[3]=r->mem_addr & 0xFF; crc_val=GetCRC16(tx_buf,4); tx_buf[4]=crc_val>>8; tx_buf[5]=crc_val&0xFF; clear_rx_cnt(r->canal); switch(r->canal) { case 1:write_canal2(6);break; case 2:write_canal(6);break; case 3:write_module(6);break; } break; case RD_HLD: tx_buf[0]=r->plc_addr; tx_buf[1]=0x03; tx_buf[2]=r->mem_addr >> 8; tx_buf[3]=r->mem_addr & 0xFF; tx_buf[4]=r->amount >> 8; tx_buf[5]=r->amount & 0xFF; crc_val=GetCRC16(tx_buf,6); tx_buf[6]=crc_val>>8; tx_buf[7]=crc_val&0xFF; clear_rx_cnt(r->canal); switch(r->canal) { case 1:write_canal2(8);break; case 2:write_canal(8);break; case 3:write_module(8);break; } break; case RD_INP: tx_buf[0]=r->plc_addr; tx_buf[1]=0x04; tx_buf[2]=r->mem_addr >> 8; tx_buf[3]=r->mem_addr & 0xFF; tx_buf[4]=r->amount >> 8; tx_buf[5]=r->amount & 0xFF; crc_val=GetCRC16(tx_buf,6); tx_buf[6]=crc_val>>8; tx_buf[7]=crc_val&0xFF; clear_rx_cnt(r->canal); switch(r->canal) { case 1:write_canal2(8);break; case 2:write_canal(8);break; case 3:write_module(8);break; } break; case RD_DINP: tx_buf[0]=r->plc_addr; tx_buf[1]=0x02; tx_buf[2]=r->mem_addr >> 8; tx_buf[3]=r->mem_addr & 0xFF; tx_buf[4]=r->amount >> 8; tx_buf[5]=r->amount & 0xFF; crc_val=GetCRC16(tx_buf,6); tx_buf[6]=crc_val>>8; tx_buf[7]=crc_val&0xFF; clear_rx_cnt(r->canal); switch(r->canal) { case 1:write_canal2(8);break; case 2:write_canal(8);break; case 3:write_module(8);break; } break; case RD_COILS: tx_buf[0]=r->plc_addr; tx_buf[1]=0x01; tx_buf[2]=r->mem_addr >> 8; tx_buf[3]=r->mem_addr & 0xFF; tx_buf[4]=r->amount >> 8; tx_buf[5]=r->amount & 0xFF; crc_val=GetCRC16(tx_buf,6); tx_buf[6]=crc_val>>8; tx_buf[7]=crc_val&0xFF; clear_rx_cnt(r->canal); switch(r->canal) { case 1:write_canal2(8);break; case 2:write_canal(8);break; case 3:write_module(8);break; } break; case RD_IO: tx_buf[0]=r->plc_addr; tx_buf[1]=0xB0; tx_buf[2]=r->mem_addr >> 8; tx_buf[3]=r->mem_addr & 0xFF; tx_buf[4]=r->amount >> 8; tx_buf[5]=r->amount & 0xFF; crc_val=GetCRC16(tx_buf,6); tx_buf[6]=crc_val>>8; tx_buf[7]=crc_val&0xFF; clear_rx_cnt(r->canal); switch(r->canal) { case 1:write_canal2(8);break; case 2:write_canal(8);break; case 3:write_module(8);break; } break; case RD_XRAM51: tx_buf[0]=r->plc_addr; tx_buf[1]=0x54; tx_buf[2]=r->mem_addr >> 8; tx_buf[3]=r->mem_addr & 0xFF; crc_val=GetCRC16(tx_buf,4); tx_buf[4]=crc_val>>8; tx_buf[5]=crc_val&0xFF; clear_rx_cnt(r->canal); switch(r->canal) { case 1:write_canal2(6);break; case 2:write_canal(6);break; case 3:write_module(6);break; } break; case RD_RAM51: tx_buf[0]=r->plc_addr; tx_buf[1]=0x50; tx_buf[2]=r->mem_addr; crc_val=GetCRC16(tx_buf,3); tx_buf[3]=crc_val>>8; tx_buf[4]=crc_val&0xFF; clear_rx_cnt(r->canal); switch(r->canal) { case 1:write_canal2(5);break; case 2:write_canal(5);break; case 3:write_module(5);break; } break; } }
int main(int argc, char * argv[]) { FILE * o; int i; char * o_name; char ** module_src; char ** module_obj; char * temp_1; char * temp_2; const unsigned int buffer_size = (1024 * 50); // Yes, I think that's enough... int num_module = 0; if (argc < 5) { for (i = 1; i < argc; i++) { fprintf(stderr, "arg %d = '%s'\n", i, argv[i]); } fprintf(stderr, "create_modules CPU HOST CC outfile.c module1.c [module2.c ...]\n"); exit(1); } fprintf(stdout, "Creating module data with CPU = '%s' HOST = '%s' CC = '%s'\n", argv[1], argv[2], argv[3]); num_module = argc - 5; module_src = malloc(sizeof(char *) * num_module); module_obj = malloc(sizeof(char *) * num_module); temp_1 = malloc(buffer_size); temp_2 = malloc(buffer_size); for (i = 5; i < argc; i++) { module_src[i - 5] = argv[i]; memset(temp_1, 0x00, buffer_size); sprintf(temp_1, "/tmp/module_XXXXXX"); mkstemp(temp_1); sprintf(temp_1 + strlen(temp_1), ".o"); module_obj[i - 5] = malloc(sizeof(char) * (strlen(temp_1) + 1)); strcpy(module_obj[i - 5], temp_1); } for (i = 0; i < num_module; i++) { printf("Creating object code for '%s'.\n", module_src[i]); } /* ** Get working path and create the necessary include headers. Use the first ** given module source file as a reference. */ memset(temp_1, 0x00, buffer_size); memcpy(temp_1, module_src[0], (unsigned int)(strrchr(module_src[0], '/') - module_src[0])); memset(temp_2, 0x00, buffer_size); memcpy(temp_2, temp_1, (unsigned int)(strrchr(temp_1, '/') - temp_1)); memset(temp_1, 0x00, buffer_size); sprintf(temp_1, "-I%s/include -I%s/hal/cpu/%s/include -I%s/hal/host/%s/include", temp_2, temp_2, argv[1], temp_2, argv[2]); /* ** Compile all the module files. */ for (i = 0; i < num_module; i++) { compile_module(argv[3], temp_1, module_src[i], module_obj[i]); } /* ** Generate the source header. */ o_name = argv[4]; o = fopen(o_name, "w"); fprintf(o, "/*\n"); fprintf(o, "** Object code of modules\n"); for (i = 0; i < num_module; i++) { fprintf(o, "** %s\n", module_src[i]); } fprintf(o, "*/\n\n"); fprintf(o, "typedef struct Module {\n"); fprintf(o, " struct Module * next;\n"); fprintf(o, " const char * name;\n"); fprintf(o, " int size;\n"); fprintf(o, " unsigned char data[0];\n"); fprintf(o, "} Module;\n"); fprintf(o, "\n"); for (i = num_module - 1; i >= 0; i--) { write_module(o, module_src[i], module_obj[i], i, i == (num_module - 1)); } fprintf(o, "struct Module * first_Module = & Module_0;\n"); fclose(o); free(temp_1); free(temp_2); for (i = 0; i < num_module; i++) { remove(module_obj[i]); free(module_obj[i]); } return 0; }