⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plc.c

📁 单片PLC,AT2581实现梯形图功能,可作为参考
💻 C
📖 第 1 页 / 共 5 页
字号:
                  help();
               sscanf(&argv[i][2],"%ld",&baudrate);
               break;
            case 'Q':  /* quick exit */
               quickexit = TRUE;
               break;
            case 'E':  /* big-endian target */
               is_littleendian = FALSE;
               break;
            default:
               help();  /* this does not return */
               break;
            }
         for (j = i; j < argc-1; j++)
            argv[j] = argv[j+1];
         argc--;
         i--;  /* remove this cmdline parameter */
         }
      }
   if (argc > 1)
      {
      switch(argv[1][0])
         {
         case '1':
            commbase = 0x03f8;
            irqnum = 4;
            break;
         case '2':
            commbase = 0x02f8;
            irqnum = 3;
            break;
         case '3':
            commbase = 0x03e8;
            irqnum = 4;
            break;
         case '4':
            commbase = 0x02e8;
            irqnum = 3;
            break;
         default:
            help();  /* this does not return */
            break;
         }
      }
   take_comm_interrupt();
   init_comm_port();
   vesamode(vesa_mode);

   dirty = FALSE;
   newladder();
   init_mouse_cursor();

   while (!exitflag)
      {
      update_mouse();
      if (csts())
         if (ci() == ESC)
            {
            if (!quickexit)
               cleanup_dirty();
            exitflag = TRUE;
            }
      }

   videomode(MODE_STANDARD_TEXT);
   reset_comm_port();
   reset_comm_interrupt();
   exit(0);
   }

WORD beep()
   {
   putchar('\007');
   return(FALSE);
   }

WORD mouseover_menuindex()
   {
   WORD i, menuindex;

   menuindex = NULL_OBJECT;
   for (i = 0; i < screen_index; i++)
      {
      if (screen_list[i].objindex == LADDER_OBJ)
         {
         if ((mouser+scroll_baserow >= screen_list[i].u_row) && (mouser+scroll_baserow < screen_list[i].l_row)
               && (mousec >= screen_list[i].l_col) && (mousec < screen_list[i].r_col))
            menuindex = i;
            /* return LAST menuindex, so we can identify elements in a rung */
         }
      else
         {
         if ((mouser >= screen_list[i].u_row) && (mouser < screen_list[i].l_row)
               && (mousec >= screen_list[i].l_col) && (mousec < screen_list[i].r_col))
            menuindex = i;
            /* return LAST menuindex, so we can identify elements in a rung */
         }
      }
   return(menuindex);
   }

void bad_filesave(savefile,filename)
   FILE savefile;
   BYTE *filename;
   {
   BYTE answer[8];
   BYTE header[64];

   if (savefile != NO_FILE)
      close(savefile);
   unlink(filename);
   sprintf(header,"Cannot save %s!",filename);
   draw_popbox(header);
   cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Press <enter> to continue",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
   getstr(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + (3 + 25) * TEXTWIDTH, answer, 1,POPBOX_FOREGROUND,POPBOX_BACKGROUND);
   show_ladder();
   }

void filesave(menuindex)
   WORD menuindex;
   {
   BYTE filename[16], answer[8];
   WORD i, j;
   FILE savefile;

   null_mouse_object();
   draw_popbox("Save Ladder");
   cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Filename ? ",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
   getstr(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + (3 + 11) * TEXTWIDTH, filename, 12,POPBOX_FOREGROUND,POPBOX_BACKGROUND);
   if (!filename[0])
      {
      show_ladder();
      return;
      }
   for (i = 0; filename[i]; i++)
      if (filename[i] == '.')
         break;
   if ((filename[i] == '\0') && (i <= 8))
      strcat(filename,".LAD");
   if ((savefile = open(filename,0)) != NO_FILE)
      {
      close(savefile);
      draw_popbox(filename);
      cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Overwrite this file (Y/N) ? ",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
      getstr(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + (3 + 28) * TEXTWIDTH, answer, 1,POPBOX_FOREGROUND,POPBOX_BACKGROUND);
      erase_popbox();
      if (toupper(answer[0]) != 'Y')
         {
         show_ladder();
         return;
         }
      }
   if ((savefile = creat(filename)) == NO_FILE)
      return(bad_filesave(savefile,filename));
   if (write(savefile,fileversion,FILEVERSION_LEN) != FILEVERSION_LEN)
      return(bad_filesave(savefile,filename));
   if (write(savefile,rungs,sizeof(rungs)) != sizeof(rungs))
      return(bad_filesave(savefile,filename));
   if (write(savefile,used_rungs,sizeof(used_rungs)) != sizeof(used_rungs))
      return(bad_filesave(savefile,filename));
   if (write(savefile,rung_list,sizeof(rung_list)) != sizeof(rung_list))
      return(bad_filesave(savefile,filename));
   if (write(savefile,&ladder_size,sizeof(ladder_size)) != sizeof(ladder_size))
      return(bad_filesave(savefile,filename));
   if (write(savefile,modbus_dataregs,sizeof(modbus_dataregs)) != sizeof(modbus_dataregs))
      return(bad_filesave(savefile,filename));
   if (close(savefile) == NO_FILE)
      return(bad_filesave(-1,filename));
   show_ladder();
   dirty = FALSE;
   }

void cleanup_dirty()
   {
   BYTE answer[8];

   if (dirty)
      {
      draw_popbox("Ladder has been changed");
      cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Save this ladder first (Y/N) ? ",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
      getstr(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + (3 + 31) * TEXTWIDTH, answer, 1,POPBOX_FOREGROUND,POPBOX_BACKGROUND);
      erase_popbox();
      if (toupper(answer[0]) == 'Y')
         filesave();
      }
   }

void bad_fileload(loadfile,filename)
   FILE loadfile;
   BYTE *filename;
   {
   BYTE answer[8];
   BYTE header[64];

   if (loadfile != NO_FILE)
      close(loadfile);
   sprintf(header,"Cannot load %s!",filename);
   draw_popbox(header);
   cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Press <enter> to continue",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
   getstr(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + (3 + 25) * TEXTWIDTH, answer, 1,POPBOX_FOREGROUND,POPBOX_BACKGROUND);
   newladder();
   }

void fileload(menuindex)
   WORD menuindex;
   {
   BYTE filename[16], answer[8];
   WORD i, j;
   FILE loadfile;

   cleanup_dirty();
   null_mouse_object();
   draw_popbox("Load Ladder");
   cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Filename ? ",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
   getstr(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + (3 + 11) * TEXTWIDTH, filename, 12,POPBOX_FOREGROUND,POPBOX_BACKGROUND);
   erase_popbox();
   if (!filename[0])
      {
      show_ladder();
      return;
      }
   for (i = 0; filename[i]; i++)
      if (filename[i] == '.')
         break;
   if ((filename[i] == '\0') && (i <= 8))
      strcat(filename,".LAD");
   if ((loadfile = open(filename,0)) == NO_FILE)
      {
      close(loadfile);
      draw_popbox(filename);
      cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"This file cannot be found",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
      cstrout(POPBOX_ROW + 6 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Press <enter> to continue",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
      getstr(POPBOX_ROW + 6 * TEXTHEIGHT, POPBOX_COL + (3 + 28) * TEXTWIDTH, answer, 1,POPBOX_FOREGROUND,POPBOX_BACKGROUND);
      show_ladder();
      return;
      }
   if (read(loadfile,tempstr,FILEVERSION_LEN) != FILEVERSION_LEN)
      return(bad_filesave(loadfile,filename));
   for (i = 0; i < FILEVERSION_LEN; i++)
      if (tempstr[i] != fileversion[i])
         break;
   if (i != FILEVERSION_LEN)
      {
      close(loadfile);
      draw_popbox(filename);
      cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Unknown file format",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
      cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Press <enter> to continue",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
      getstr(POPBOX_ROW + 6 * TEXTHEIGHT, POPBOX_COL + (3 + 28) * TEXTWIDTH, answer, 1,POPBOX_FOREGROUND,POPBOX_BACKGROUND);
      show_ladder();
      return;
      }
   dirty = FALSE;  /* from here on, success or fail, we are "clean" */
   if (read(loadfile,rungs,sizeof(rungs)) != sizeof(rungs))
      return(bad_fileload(loadfile,filename));
   if (read(loadfile,used_rungs,sizeof(used_rungs)) != sizeof(used_rungs))
      return(bad_fileload(loadfile,filename));
   if (read(loadfile,rung_list,sizeof(rung_list)) != sizeof(rung_list))
      return(bad_fileload(loadfile,filename));
   if (read(loadfile,&ladder_size,sizeof(ladder_size)) != sizeof(ladder_size))
      return(bad_fileload(loadfile,filename));
   if (read(loadfile,modbus_dataregs,sizeof(modbus_dataregs)) != sizeof(modbus_dataregs))
      return(bad_fileload(loadfile,filename));
   close(loadfile);
   screen_index = NUM_MENU_ELEMENTS;
   for (i = 0; i < MAX_RUNGS; i++)
      {
      if (used_rungs[i])
         {
         rungs[i].info.left_action = ladder_node_add;
         rungs[i].info.right_action = ladder_node_del;
         screen_list[screen_index++] = (struct element_info *)&rungs[i];
         }
      }
   show_ladder();
   }

void ladder_node_add(menuindex)
   WORD menuindex;
   {
   WORD r, c;
   WORD index;
   WORD rung;

   for (rung = 0; rung < MAX_RUNGS; rung++)
      if ((used_rungs[rung])
             && (mouser+scroll_baserow >= rungs[rung].info.u_row) && (mouser+scroll_baserow < rungs[rung].info.l_row)
             && (mousec >= rungs[rung].info.l_col) && (mousec < rungs[rung].info.r_col))
         break;
   if (rung == MAX_RUNGS)  /* can't find correct rung */
      {
      strout(500,500,"Oops!  can't find rung!  ");
      return;
      }
   if ((index = (mousec - rungs[rung].info.l_col) / LADDER_ELEMENT_WIDTH) >= rungs[rung].num_elements)
      {
      strout(500,500,"1: Oops!  index > ELEMENTS_PER_RUNG  ");
      return;
      }
   if (mouse_object == ORBRANCH_OBJ)
      {
      add_or_branch(rung,index);
      show_ladder();
      return;
      }
   if (mouse_object == EXPAND_OBJ)
      {
      expand_or_branch(rung,index);
      show_ladder();
      return;
      }
#ifndef SIMPLE_ADDROW
   if (mouse_object == ADDROW_OBJ)
      {
      null_mouse_object();
      for (r = 0; r < ladder_size; r++)
         if (rung_list[r] == rung)
            break;
      if (r != ladder_size)  /* if a "root" rung */
         addrow(r+1);  /* add AFTER current rung */
      show_ladder();
      return;
      }
   if (mouse_object == DELROW_OBJ)
      {
      null_mouse_object();
      return;
      }
#endif
   if (rungs[rung].node[index].objindex == NULL_OBJ)
      {
      if (mouse_object == NULL_OBJ)
         return;  /* nothing to drop */
      rungs[rung].node[index].objindex = mouse_object;
      }
   else
      null_mouse_object();
   dirty = TRUE;
   strout(r = rungs[rung].info.u_row-scroll_baserow,c = rungs[rung].info.l_col+TEXTWIDTH+index*LADDER_ELEMENT_WIDTH,rung_element);
   (*objs[rungs[rung].node[index].objindex].drawfn)(r,c,&rungs[rung].node[index],GREEN,TEXTBACKGROUND);
   (*objs[rungs[rung].node[index].objindex].initfn)(&rungs[rung].node[index]);
   show_ladder();
   }

void ladder_node_del(menuindex)
   WORD menuindex;
   {
   WORD r, c;
   WORD index;
   WORD rung;

   for (rung = 0; rung < MAX_RUNGS; rung++)
      if ((used_rungs[rung])
             && (mouser+scroll_baserow >= rungs[rung].info.u_row) && (mouser+scroll_baserow < rungs[rung].info.l_row)
             && (mousec >= rungs[rung].info.l_col) && (mousec < rungs[rung].info.r_col))
         break;
   if (rung == MAX_RUNGS)  /* can't find correct rung */
      {
      strout(500,500,"Oops!  can't find rung!  ");
      null_mouse_object();
      return;
      }
   if ((index = (mousec - rungs[rung].info.l_col) / LADDER_ELEMENT_WIDTH) >= rungs[rung].num_elements)
      {
      strout(500,500,"2: Oops!  index > ELEMENTS_PER_RUNG  ");
      null_mouse_object();
      return;
      }
#ifndef SIMPLE_ADDROW
   if (mouse_object == ADDROW_OBJ)
      {
      null_mouse_object();
      for (r = 0; r < ladder_size; r++)
         if (rung_list[r] == rung)
            break;
      if (r != ladder_size)  /* if a "root" rung */
         addrow(r);  /* add BEFORE current rung */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -