发新帖本帖赏金 5.00元(功能说明)我要提问
返回列表
打印

一种用于快速开发的C编程结构(工控系统)

[复制链接]
15885|133
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fekua|  楼主 | 2019-4-20 23:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 fekua 于 2019-6-26 16:58 编辑

   盖到100楼 就开源!!!   由于我们这边的整个工控行业结构:机械厂(只做非标机器,不做数控系统)<-->数控设计公司(个人)(专门给机械厂开发工控程序(系统))..所以我个人一年差不多承接的项目大概有100多个项目,,,平均一个项目的开发时间基本也就几天时间..
   因为在这种快餐式开发工控系统情况下.我通过多年的时间,经过各个同行业的高手的指点下,现在基本完善了一套高效编程(C语言)的程序结构,,因此实现了快速开发(工控)系统的目的,,该程序结构已通过几百个(工控)项目中运行,目前非常稳定...
   因此我想将编程系统的进行开源,,由于我不怎么会说话,,所以不足之处,,请大家谅解
      硬件方面:主芯片(STM32F407系列),主板(为组合模式--6组(每组8点)),组合的意思,,就是任意一组都可以随意改变输出(输入)或电机控制(脉冲+方向),,,      触摸屏选用:迪文DGUS串口屏[free]硬件: 2018-10.rar (3.02 MB)
步骤编程上位机: PLCV1.2.rar (2.21 MB) 端口设置软件.rar (820.16 KB)
底层程序开源:   PLC_V1.2.part01.rar (4 MB) PLC_V1.2.part02.rar (4 MB) PLC_V1.2.part03.rar (4 MB) PLC_V1.2.part04.rar (1.17 MB) 例程: 测试工程文件.rar (50.14 KB)
      开发环境用的是IAR..迪文屏里面,有个人编写的一个OS文件...有了这个文件,跟我的底层程序配套,,这样做界面基本可以上可以快速实现界面开发...不用每做一个项目就要花几个星期的时间来开发界面的工作的.哪天有空了,,上传个界面的迪文(或者武汉中显)工程文件,,因为现有的工程文件都有机械厂的信息,,所以就不方便开源了...

使用特权

评论回复

打赏榜单

21ic小喇叭 打赏了 5.00 元 2019-05-17
理由:期待开源分享

评论
547302886 2019-6-9 23:19 回复TA
牛批 

相关帖子

沙发
fekua|  楼主 | 2019-4-21 00:01 | 只看该作者
/******************************************************************************
* 文件名称: 外齿雕铣机
* 摘    要:
* 当前版本:
* 修改说明:
* 重要说明:
******************************************************************************/
#include "Comm.h"
#include "Work_INT.h"
/**********************************************************
* 名    称: Hand_IN1_Main()
* 功    能: 送料动作流程
* 入口参数:
* 出口参数:
**********************************************************/
void Hand_IN1_Main(TASKSTRDEF *mTask)
{
  if(mTask->ErrF)return;
SETPSTA(mTask->Sta)://等待启动
  StepName("等待启动...      ");
  if(HAND_IN1_Run == RUN){
    Next();
  }
SETPRUN(1)://
  StepName("手臂1进入...     ");
  HAND_1(ON);
  if(SHOUBI1_IN_FLAG){//等待感应亮
    Next();
  }
  SETPERR(JXSB1_ErrTime,JXSB1_ErrNumB);
SETPDEF://其他
  StepName("动作完成...      ");
  HAND_IN1_Run = STOP;
  GOTOS(0);
SETPEND
}
/**********************************************************
* 名    称: Hand_IN2_Main()
* 功    能: 送料动作流程
* 入口参数:
* 出口参数:
**********************************************************/
void Hand_IN2_Main(TASKSTRDEF *mTask)
{
  if(mTask->ErrF)return;
SETPSTA(mTask->Sta)://等待启动
  StepName("等待启动...      ");
  if(HAND_IN2_Run == RUN){
    Next();
  }
SETPRUN(1)://
  StepName("手臂2进入...     ");
  HAND_2(ON);
  if(SHOUBI2_IN_FLAG){//等待感应亮
    Next();
  }
  SETPERR(JXSB2_ErrTime,JXSB2_ErrNumB);//手臂进入--故障
SETPDEF://其他
  StepName("动作完成...      ");
  HAND_IN2_Run = STOP;
  GOTOS(0);
SETPEND
}

/**********************************************************
* 名    称: JXS_QL_Main()
* 功    能: 机械手到取料位
* 入口参数:
* 出口参数:
**********************************************************/
void JXS_QL_Main(TASKSTRDEF *mTask)
{
  if(mTask->ErrF)return;
SETPSTA(mTask->Sta)://等待启动
  StepName("等待启动...      ");
  if(JXS_QL_Run == RUN){
    Next();
  }
SETPRUN(1)://
  StepName("机械手移至取料位 ");
  JXS_OUT;
  GY(XuanZ_Y,OFF);
  if(JXS_OU_FLAG){//等待感应亮
    Next();
  }
  SETPERR(JXS_ErrTime,JXS_ErrNumB);
SETPRUN(2)://
  StepName("关机械手移动阀门 ");
  JXS_OFF;
  Next();
SETPRUN(3)://
  StepName("手臂旋转-退到位亮");
  if(SHOUBXZ_OU_FLAG){//等待感应亮
    Next();
  }
  SETPERR(SB_XZ_ErrTime,SB_XZ_ErrNumB);
SETPDEF://其他
  StepName("动作完成...      ");
  JXS_QL_Run = STOP;
  GOTOS(0);
SETPEND
}
/**********************************************************
* 名    称: JXS_FL_Main()
* 功    能: 机械手到放料位
* 入口参数:
* 出口参数:
**********************************************************/
void JXS_FL_Main(TASKSTRDEF *mTask)
{
  if(mTask->ErrF)return;
SETPSTA(mTask->Sta)://等待启动
  StepName("等待启动...      ");
  if(JXS_FL_Run == RUN){
    Next();
  }
SETPRUN(1)://
  StepName("机械手移至放料位 ");
  JXS_IN;
  if(JXS_IN_FLAG){//等待感应亮
    Next();
  }
  SETPERR(JXS_ErrTime,JXS_ErrNumB);
SETPRUN(2)://
  StepName("关机械手移动阀门");
  JXS_OFF;
  Next();
SETPDEF://其他
  StepName("动作完成...      ");
  JXS_FL_Run = STOP;
  GOTOS(0);
SETPEND
}
步骤编程的样子基本就这样子..

使用特权

评论回复
板凳
fekua|  楼主 | 2019-4-21 00:03 | 只看该作者
/**********************************************************
* 名    称: RunTask_SRC()
* 功    能:
* 入口参数:
* 出口参数:
**********************************************************/
void RunTask_SRC()
{
  u8 i=0;
  TaskTab_Next(WORK_CLR_Main);
  
  TaskTab_Next(HanJ_QL_Main);
  TaskTab_Next(SonL_QL_Main);   //送料--取料流程
  TaskTab_Next(SonC_FL_Main);   //送串--放料流程
  TaskTab_Next(XiYa_QL_Main);   //铣牙--取料动作
  TaskTab_Next(XiYa_FL_Main);   //铣牙--放料动作
  
  TaskTab_Next(XiYa_Main);      //铣牙
  TaskTab_Next(XiYa_Test_Main); //铣牙测试
  TaskTab_Next(XtoZ_Main);
  TaskTab_Next(ZtoX_Main);
  
  TaskTab_Next(SonC_Main);      //送串动作流程
  TaskTab_Next(CHMOTO_Main);    //电机串环流程
  TaskTab_Next(CHTEST_Main);    //电机串环测试

  TaskTab_Next(JXS_QL_Main);
  TaskTab_Next(JXS_FL_Main);
  
  TaskTab_Next(Hand_IN1_Main);
  TaskTab_Next(Hand_IN2_Main);
  
  TaskTab_Next(XuanZ_QL_Main);
  TaskTab_Next(XuanZ_HJ_Main);
  
  TaskTab_Next(TB_Main);
  TaskTab_Next(LiaoG_Main);
  TaskTab_Next(HanJ_Main);
  TaskTab_Next(HanJ_Test_Main);
  
  TaskTab_Next(CHXZ_Moto_Main);
  TaskTab_Next(CHXZ_Rest_Main);
  
  TaskTab_Next(LOCKJS_Main);
  TaskTab_Next(AutoLock_Main);
////////////////////////////////////////
  for(u8 i=0;i<Task_MAX;i++){
    if(Task_Tab[i].Main){
      MainRun(sTask(i).Task,Task_Tab[i].Main,0);
      StpFlow(Task_Tab[i].Main);
    }
    else break;
  }
}
任务初始化  (工作流程)

使用特权

评论回复
地板
fekua|  楼主 | 2019-4-21 00:05 | 只看该作者
/**********************************************************
* 名    称: Work_RunSRC()
* 功    能: 运行中的流程
* 入口参数:
* 出口参数:
**********************************************************/
void Work_RunSRC()
{
  TaskRun(MainTask);            //主流程
  TaskRun(KeyTask);             //启动按钮流程
  
  for(u8 i=0;i<Task_MAX;i++){
    if(Task_Tab[i].Main){
      sTaskRun(i);
    }
  }
  
}

使用特权

评论回复
5
fekua|  楼主 | 2019-4-21 00:08 | 只看该作者
本帖最后由 fekua 于 2019-4-24 00:07 编辑

显示器上面的"状态"栏的文字来源于程序中的-----StepName("关闭所有输出  ");这样当机器因为某种原因 停止了,就可以检查是哪个步骤上出问题了..
/******************************************************************************
* 文件名称:
* 摘    要:
* 当前版本:
* 修改说明:
* 重要说明:
******************************************************************************/
#include "Comm.h"
#include "Work_INT.h"
void WorkSta_Main(TASKSTRDEF *mTask);
void RestSta_Main(TASKSTRDEF *mTask);

BIT_UN RUN_Flag;
///////////////////////////////////////////////////
void Rest_Main(TASKSTRDEF *mTask)
{
  s32 adder = 0;
  if(mTask->ErrF)return;
  WORK_RUN = STOP;
SETPSTA(mTask->Sta)://等待启动
  StepName("设备复位...      ");
  if(RestFlag == 0){
    Next();
  }
SETPRUN(1)://
  StepName("关闭所有输出     ");
  for(u8 i=0;i< OUT_Pro;i++){
    Out_Gpio.buff16 = 0;
  }
  Next();
SETPRUN(2)://
  StepName("等拨码开关至运行 ");
  if(InPutFlag_RUN == RUN){
    Next();
  }
SETPRUN(3)://
  StepName("等待手臂1退到位  ");
  if(SHOUBI1_OU_FLAG){
    Next();
  }
SETPRUN(4)://
  StepName("等待手臂2退到位  ");
  if(SHOUBI2_OU_FLAG){
    Next();
  }
SETPRUN(5)://
  StepName("等手臂旋转-退到位");
  if(SHOUBXZ_OU_FLAG){
    Next();
  }
SETPRUN(6)://
  StepName("等待机械手退到位 ");
  JXS_OUT;
  if(JXS_OU_FLAG){
    JXS_OFF;
    Next();
  }
SETPRUN(7)://
  StepName("送串左感应亮...  ");
  if(GX(SongC_ZY_Ou_X)){
    GOTOS(12);
  }
///////////////////////////////////
SETPRUN(12)://
  StepName("Z轴电机--校零... ");
  MOTO_RST(Z_Moto) = RUN;
  MOTO_RST(XZ_Moto) = RUN;
  Next();
SETPRUN(13)://
  StepName("Z轴电机--校零... ");
  if(MOTO_RST(Z_Moto) == STOP){
    Next();
  }
SETPRUN(14)://
  StepName("X,Y电机--校零... ");
  MOTO_RST(X_Moto) = RUN;
  MOTO_RST(Y_Moto) = RUN;
  Next();
SETPRUN(15)://
  StepName("X,Y电机--校零... ");
  if(MOTO_END(X_Moto) && MOTO_END(Y_Moto)){
    Next();
  }
SETPRUN(16)://
  StepName("旋转电机--复位完成");
  if(MOTO_RST(XZ_Moto) == STOP){
    Next();
  }
SETPRUN(17)://
  StepName("旋转电机--手臂位.");
  adder = ACTTOPULL(XZ_Moto,rPar[XuanZ_StaAdd]);
  MotoGoToMppDef(XZ_Moto,adder,rPar[XuanZ_SPED]);
  Next();
SETPRUN(18)://
  StepName("旋转电机--手臂位.");
  if(MOTO_END(XZ_Moto)){
    GOTOS(20);
  }
//////////////////////////////////////////
SETPRUN(20)://
  StepName("所有流程--复位...");
  RunTask_INT();
  CLR_Err();
  Next();
SETPRUN(21)://
  StepName("串环放料电机,复位.");
  CHXZ_REST = RUN;
  Next();
SETPRUN(22)://
  StepName("串环放料电机,复位.");
  if(CHXZ_REST == STOP){
    Next();
  }
SETPRUN(23)://
  StepName("复位完成       ");
  RestFlag = 1;
  CHuan_Run = RUN;//清空串环位
  SWTASK(WorkSta_Main);
SETPDEF://其他
  GOTOS(0);
SETPEND
}
/**********************************************************
* 名    称: Work_Main()
* 功    能: 项目工作总流程
* 入口参数:
* 出口参数:
**********************************************************/
void Work_Main(TASKSTRDEF *mTask)
{
  if(mTask->ErrF)return;
SETPSTA(mTask->Sta)://等待启动
  StepName("等待启动...      ");
  if(WORK_RUN == RUN){
    Next();
  }
SETPRUN(1)://
  StepName("机械手至取料位   ");
  JXS_QL_Run = RUN;
  GY(XiYa_Moto,ON);
  GY(ZhenDong_Y,ON);
  Next();
SETPRUN(2)://
  StepName(ReadName(JXS_QL_Main));
  if(JXS_QL_Run == STOP){
    Next();
  }
SETPRUN(3)://
  StepName(ReadName(HanJ_QL_Main));
  if(HanJ_QL_RUN == STOP){
    Next();
  }
SETPRUN(4)://
  StepName("启动取料动作..   ");
  RUN_Flag.all = RUN_Flag.all << 1;
  SonL_QL_Flag = SonLQL_Ram;
  SonLQL_Ram = 0;
  SonL_QL_RUN = SonL_QL_Flag;
  XiYa_QL_Run = XiYa_QL_Flag;
  Next();
SETPRUN(5)://
  StepName(ReadName(SonL_QL_Main));
  if((SonL_QL_RUN == STOP)){
    HanJ_QL_RUN = RUN;
    Next();
  }
SETPRUN(6)://
  StepName(ReadName(XiYa_QL_Main));
  if((XiYa_QL_Run == STOP)){
    GOTOS(10);
  }
/////////////////////////////////
SETPRUN(10)://
  StepName("机械手至放料...  ");
  JXS_FL_Run = RUN;
  RUN_Flag.all = RUN_Flag.all << 1;
  Next();
SETPRUN(11)://
  StepName(ReadName(JXS_FL_Main));
  if(JXS_FL_Run == STOP){
    Next();
  }
SETPRUN(12):
  StepName("启动放料动作...");
  SonC_FL_Run = SonC_FL_Flag;
  XiYa_FL_Run = XiYa_FL_Flag;
  Next();
SETPRUN(13)://
  StepName(ReadName(SonC_FL_Main));
  if(SonC_FL_Run == STOP){
    Next();
  }
SETPRUN(14)://
  StepName(ReadName(XiYa_FL_Main));
  if(XiYa_FL_Run == STOP){
    GOTOS(20);
  }
/////////////////////////////////
SETPRUN(20)://
  StepName("机械手至取料位   ");
  JXS_QL_Run = RUN;
  Next();
SETPRUN(21)://
  StepName("判断是否结束流程.");
  RUN_Flag.all &= 0x0f;
  if(SYST_RUN == STOP && RUN_Flag.all == 0){
    WORK_RUN = STOP;
    GY(XiYa_Moto,OFF);
    GY(ZhenDong_Y,OFF);
    SWTASK(WorkSta_Main);
  }
  else{
    if(WORK_RUN == STOP){
      GY(XiYa_Moto,OFF);
      GY(ZhenDong_Y,OFF);
    }
    Next();
  }
SETPDEF://其他
  GOTOS(0);
SETPEND
}
/**********************************************************
* 名    称: WorkSta_Main()
* 功    能:
* 入口参数:
* 出口参数:
**********************************************************/
void WorkSta_Main(TASKSTRDEF *mTask)
{
SETPSTA(mTask->Sta)://等待启动
  StepName("等待启动命令...  ");
  if(SYST_RUN == RUN){
    Next();
  }
///////////////////////////////////////
SETPRUN(1)://
  StepName("主流程启动...    ");
  
  WORK_RUN = RUN;
  HanJ_RUN = RUN;
  HanJ_DONE = NOTD;
  HanJ_QL_RUN = RUN;
  
  HanJ_Stop = 0;
  HanJ_Ql_Stop = 0;
  
  HJ_NumBer = 0;
  SL_NumBer = 0;
  XY_NumBer = 0;
  SC_NumBer = 0;
  
  RUN_Flag.all = 0;
  Next();
SETPRUN(2)://
  SWTASK(Work_Main);
////////////////////////////////////////////////
SETPDEF://其他
  GOTOS(0);
SETPEND
}


使用特权

评论回复
6
fekua|  楼主 | 2019-4-21 00:20 | 只看该作者
等有空在将这个文本一体机的源码也来开源一下

使用特权

评论回复
7
fekua|  楼主 | 2019-4-21 00:27 | 只看该作者

使用特权

评论回复
评论
lihui567 2019-5-26 12:05 回复TA
这个是用啥做的 
8
chongdongchen| | 2019-4-21 12:40 | 只看该作者
支持一下

使用特权

评论回复
9
YDCMAN| | 2019-4-21 13:37 | 只看该作者
本帖最后由 YDCMAN 于 2019-4-21 13:42 编辑

最近一直在思考这个问题,支持一下

使用特权

评论回复
10
qq312448494| | 2019-4-21 13:58 | 只看该作者
感兴趣,支持一下!

使用特权

评论回复
11
QuakeGod| | 2019-4-21 14:08 | 只看该作者
嗯,做的不错。

使用特权

评论回复
12
gyh02133| | 2019-4-21 20:47 | 只看该作者
有没有打包一下,上传上来啊

使用特权

评论回复
13
qinxingtech| | 2019-4-22 09:23 | 只看该作者
楼主厉害

使用特权

评论回复
14
netzhang| | 2019-4-22 09:56 | 只看该作者
添砖加瓦

使用特权

评论回复
15
13738406788| | 2019-4-22 10:00 | 只看该作者
感兴趣,支持一下,楼主能不能开源一下

使用特权

评论回复
16
yanhaijian| | 2019-4-22 11:21 | 只看该作者
围观,看看有什么技巧。

使用特权

评论回复
17
zjsx8192| | 2019-4-22 11:48 | 只看该作者
打酱油围观

使用特权

评论回复
18
masmin| | 2019-4-22 11:54 | 只看该作者

使用特权

评论回复
19
coody| | 2019-4-22 12:15 | 只看该作者
吃瓜群众添一层

使用特权

评论回复
20
HARRY007| | 2019-4-22 12:17 | 只看该作者
+1等待开源

使用特权

评论回复
发新帖 本帖赏金 5.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

29

帖子

6

粉丝