示例#1
0
文件: master.c 项目: atikbif/Relkon6
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);
}
示例#2
0
文件: master.c 项目: atikbif/Relkon6
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);
}
示例#3
0
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;
			}

		}
	}
示例#4
0
文件: master.c 项目: atikbif/Relkon6
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;
	}
}
示例#5
0
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;
  
}