EPAI-PLC_COMMUNICATION_APP:基于flask的PLC通讯以及基恩士相机数据获取

项目地址:https://gitee.com/Euler_liangjh/PLC_COMMUNICATION_APP

简介


该仓库主要是基于Flask-Restful、python-snap7以及基恩士相机相关依赖开发的PLC线上数据获取后台,主要对西门子的PLC上的DB块进行数据的储存和读取,同时对基恩士LJX8000A进行操作进行三维数据的获取。

其他文档

各模块简介

通讯DB块设计文档

相机说明

基恩士相机python依赖说明

使用postman手动调试相机

结构说明

主要业务逻辑在

│  start.py  # 启动文件
│          
├─app
│  │  app.py
│  │  plc_client.py  # PL客户端连接
│  │  __init__.py
│  │  
│  ├─api
│  │  │  __init__.py
│  │  │          
│  │  ├─v2  # V1和V2的区别:V2的的相机获取必须先切换程序后,之后的所有的需求开发都在V2的基础上开发
│  │  │  │  urls.py  # 所有的接口URL
│  │  │  │  __init__.py
│  │  │  │  
│  │  │  ├─resource
│  │  │  │  │  camera_api.py  # 相机数据相关api
│  │  │  │  │  camera_utils.py  # 相机api的具体实现
│  │  │  │  │  read_DB_data.py  # DB块的读取功能
│  │  │  │  │  test_api.py  # 测试用的api,检测
│  │  │  │  │  write_DB_data.py  # DB块的存储功能
│  │  │  │  │  __init__.py    
│  │          
│  ├─config  # 配置文件
│  │  │  CAMERA_CFG.json  # 相机
│  │  │  msg.yaml  # flask返回应答的配置
│  │  │  PLC_CFG.json  # PLC相关信息的配置
│  │  │  variable_setting.py  # DB块所有地址的配置
│  │  │  VERSION.json  # V1 V2的版本配置
│  │          
│  ├─libs  # 异常相关的配置【没用到】
│  │  │  APIException.py
│  │  │  error.py
│  │  │  __init__.py
│          
├─common
├─doc
│      
├─static  # 静态文件和相关依赖
│  │  snap7.dll  # python-snap7的依赖
│  │  snap7.lib
│  │  
│  └─KEYENCE_LJX8000A  # 基恩士相机的相关依赖,具体详情见相机相关说明
│      ├─include
│      │      LJX8_ErrorCode.h
│      │      LJX8_IF_Linux.h
│      │      LJXA_ACQ.h
│      │      
│      ├─libsrc
│      │      LJX8_IF_Linux.cpp
│      │      LJXA_ACQ.cpp
│      │      ProfileDataConvert.cpp
│      │      ProfileDataConvert.h
│      │      
│      └─PYTHON
│          │  libljxacom.so
│          │  LJX8_IF.dll
│          │  LJXAwrap.py
│          │  Makefile
│          │  sample_HowToCallFunctions.py
│          │  sample_ImageAcquisition.py
│          │  
│          ├─obj
│          │      LJX8_IF_Linux.o
│          │      LJXA_ACQ.o
│          │      ProfileDataConvert.o
│                  
├─templates
└─utils
    │  api_test_utils.py  # 
    │  code.py  # http code的配置
    │  plc_simulation.py  # 模拟IPC->PLC的场景 单元测试用
    │  plc_test.py  # 模拟本app【弃用,直接使用postman进行接口测试】
    │  response.py  # http 返回的封装

PLC后端返回体说明

  • 使用flask-resful搭建后端web程序,Response结构如下:

    {
      "lang": "zh_CN",
      "data": {
          "name": "ljh",
          "age": 18
      },
      "msg": "成功",
      "code": 0
    }

    注:

    • code返回是-1表示fail,说明该操作出现异常
    • 下面的返回只有data里的数据
  • ip:127.0.0.1

  • 端口:5000

Read接口

1. 读取心跳位(PLC地址0.0)

  • 请求方法:GET

  • 接口:/api/readHeartBeat

  • 参数:None

  • 返回:

    {
      "heart_beat_value": "0"
    }
  • 说明:心跳接口建议1秒钟请求一次,能获取PLC上1001之类的心跳

2. 读取数据清除位(PLC地址0.1),该位用于清除中间文件夹数据,且清除各握手标志位

  • 请求方法:GET

  • 接口:/api/readClearFileDataRequest

  • 参数:None

  • 返回:

    {
      "clear_file_data_req_value": "0"
    }

3. 读取3D扫描完成位(PLC地址0.2)

  • 请求方法:GET

  • 接口:/api/read3DTriggerDone

  • 参数:None

  • 返回:

    {
      "trigger_done_value": "0"
    }

4. 读取AI检测请求位(PLC地址0.3)

  • 请求方法:GET

  • 接口:/api/readAICheckRequest

  • 参数:None

  • 返回:

    {
      "AI_check_req_value": "0"
    }

5.读取确认收到了AI检查结果位(PLC地址0.4)

  • 请求方法:GET

  • 接口:/api/readAIDoneACK

  • 参数:None

  • 返回:

    {
      "ai_done_ACK_value": "0"
    }

6.读取激活相机正面程序位(PLC地址0.5)

  • 请求方法:GET

  • 接口:/api/readActiveProgramUp

  • 参数:None

  • 返回:

    {
      "ActiveProgramUp_value": "0"
    }

7.读取激活相机侧面程序位(PLC地址0.6)

  • 请求方法:GET

  • 接口:/api/readActiveProgramSide

  • 参数:None

  • 返回:

    {
      "ActiveProgramSide_value": "0"
    }

8.读取相机正面程序号(PLC地址4.0-5.7)

  • 请求方法:GET

  • 接口:/api/readProgramNoTop

  • 参数:None

  • 返回:

    {
      "ProgramNoTop_value": 1
    }

9.读取相机侧面程序号(PLC地址6.0-7.7)

  • 请求方法:GET

  • 接口:/api/readProgramNoSide

  • 参数:None

  • 返回:

    {
      "ProgramNoSide_value": 0
    }

10. 读取DMC码(PLC地址20.0-99.7)

  • 请求方法:GET

  • 接口:/api/readDMC

  • 参数:None

  • 返回:

    
    {
      "DMC_value": "123456789012345678901234567890666"
    }

write接口

写接口的data返回无内容,看是否写成功主要看整个response的code是否是0,并且msg为"成功"

1. 写心跳

  • 请求方法:POST

  • 接口:/api/writeHeartBeat

  • 参数:

    参数 必选 类型 说明
    heart_signal True int 0 或者1
  • 返回:None

  • 说明:请求间隔建议1.6s

2.写DMC码

  • 请求方法:POST

  • 接口:/api/writeDMC

  • 参数:

    参数 必选 类型 说明
    DMC_data True String DMC码
  • 返回:None

3. 文件清除完成(PLC地址100.1)

根据需求写入PLC的DB块,clear_req为1或者0
  • 请求方法:POST

  • 接口:/api/writeClearReq

  • 参数:

    参数 必选 类型 说明
    clear_req True Int 文件夹数据,且各握手标志位都复位完成,0或者1,下同
  • 返回:None

4. 确定3D文件已收到(PLC地址100.2)

  • 请求方法:POST

  • 接口:/api/writeFileRec

  • 参数:

    参数 必选 类型 说明
    file_rec True Int 确认3D文件已经收到
  • 返回:None

5. AI分析完成(PLC地址100.3)

  • 请求方法:POST

  • 接口:/api/writeAICheckDone

  • 参数:

    参数 必选 类型 说明
    check_done True Int AI分析完成
  • 返回:None

6. AI正面结果OK(PLC地址100.4)

  • 请求方法:POST

  • 接口:/api/writeAIUPOK

  • 参数:

    参数 必选 类型 说明
    OK True Int AI正面结果OK
  • 返回:None

7. AI正面结果NOK(PLC地址100.5)

  • 请求方法:POST

  • 接口:/api/writeAIUPNOK

  • 参数:

    参数 必选 类型 说明
    NOK True Int AI正面结果NOK
  • 返回:None

8. 相机正面程序调整结束(PLC地址100.6)

  • 请求方法:POST

  • 接口:/api/writeActiveProgramUpOK

  • 参数:

    参数 必选 类型 说明
    ac_pro_up_ok True Int 相机正面程序调整结束
  • 返回:None

9. 相机侧面程序调整结束(PLC地址100.7)

  • 请求方法:POST

  • 接口:/api/writeActiveProgramUSideOK

  • 参数:

    参数 必选 类型 说明
    ac_pro_side_ok True Int 相机侧面程序调整结束
  • 返回:None

8.AI侧面结果OK(PLC地址102.0)

  • 请求方法:POST

  • 接口:/api/writeAISideOK

  • 参数:

    参数 必选 类型 说明
    OK True Int AI侧面结果OK
  • 返回:None

9. AI侧面结果NOK(PLC地址102.1)

  • 请求方法:POST

  • 接口:/api/writeAISideNOK

  • 参数:

    参数 必选 类型 说明
    NOK True Int AI侧面结果NOK
  • 返回:None

10. 正面Pin1的形态(PLC地址102.2)

  • 请求方法:POST

  • 接口:/api/writePin1UpAppearance

  • 参数:

    参数 必选 类型 说明
    appearance True Int Pin1_Up_Appearance=1:不合格,Pin1_Up_Appearance=0合格
  • 返回:None

11. 正面Pin2的形态(PLC地址102.3)

  • 请求方法:POST

  • 接口:/api/writePin2UpAppearance

  • 参数:

    参数 必选 类型 说明
    appearance True Int Pin2_Up_Appearance=1:不合格,Pin2_Up_Appearance=0合格
  • 返回:None

12. 正面Pin3的形态(PLC地址102.4)

  • 请求方法:POST

  • 接口:/api/writePin3UpAppearance

  • 参数:

    参数 必选 类型 说明
    appearance True Int Pin3_Up_Appearance=1:不合格,Pin3_Up_Appearance=0合格
  • 返回:None

13. 特定区域1是否有锡珠(PLC地址102.5)

  • 请求方法:POST

  • 接口:/api/writeSpecialPosition1

  • 参数:

    参数 必选 类型 说明
    have True Int hava=1:有,hava=0:无
  • 返回:None

14. 特定区域2是否有锡珠(PLC地址102.6)

  • 请求方法:POST

  • 接口:/api/writeSpecialPosition2

  • 参数:

    参数 必选 类型 说明
    have True Int hava=1:有,hava=0:无
  • 返回:None

15. 特定区域3是否有锡珠(PLC地址102.7)

  • 请求方法:POST

  • 接口:/api/writeSpecialPosition3

  • 参数:

    参数 必选 类型 说明
    have True Int hava=1:有,hava=0:无
  • 返回:None

16. 写侧面Pin1的体积(PLC地址104.0-107.7)

  • 请求方法:POST

  • 接口:/api/writePin1SideVolume

  • 参数:

    参数 必选 类型 说明
    volume True flt "12.21"
  • 返回:None

17. 写侧面Pin2的体积(PLC地址108.0-111.7)

  • 请求方法:POST

  • 接口:/api/writePin2SideVolume

  • 参数:

    参数 必选 类型 说明
    volume True str "12.21"
  • 返回:None

18. 写侧面Pin3的体积(PLC地址112.0-115.7)

  • 请求方法:POST

  • 接口:/api/writePin3SideVolume

  • 参数:

    参数 必选 类型 说明
    volume True str "12.21"
  • 返回:None

19. 初始化:所有点位清空、所有检测结果

  • 请求方法:GET
  • 接口:/api/InitAll
  • 参数:None
  • 返回:None

相机相关接口

1. 相机切换程序

  • 请求方法:POST

  • 接口:/api/cameraChange

  • 参数:

    参数 必选 类型 说明
    programNo_set True int 0 1 2 3
  • 返回:

    data字段里返回当前的活跃程序activate_programNo_setori_programNo_set是原来的活跃程序。通过判断给的切断程序号以及活跃程序号判断是否改变成功,change_status为1是成功,为0修改是失败,-1就是相机出现问题通讯失败

    {
      "ori_programNo_set": 0,
      "activate_programNo_set": 1,
      "change_status": 1
    }
    {
      "ori_programNo_set": 1,
      "activate_programNo_set": 4,
      "change_status": 0
    }
    {
      "ori_programNo_set": false,
      "activate_programNo_set": false,
      "change_status": -1
    }

2. 相机拿数据

  • 请求方法:POST

  • 接口:/api/cameraGetData

  • 参数:

    参数 必选 类型 说明
    dmc True str 0
    direction True int 正面数据或者侧面数据
    正面为1
    侧面为0
  • 返回:

    获取失败的msg汇总

    msg
    LJX8IF_InitializeHighSpeedDataCommunicationSimpleArray Error
    LJX8IF_PreStartHighSpeedDataCommunication Error
    LJX8IF_StartHighSpeedDataCommunication Error
    Failed to acquire image (timeout)
    {
      "msg": "LJX8IF_InitializeHighSpeedDataCommunicationSimpleArray Error",
      "get_status": -1
    }
    
    {
        "msg": "get success",
        "get_status": 1
    }

开源许可证

该项目采用 AGPL

引用

如果你在研究中使用了本项目的代码,请参考如下 bibtex 引用 EPAI-PLC_COMMUNICATION_APP。

@article{epai-plc-communication-app,
  title   = {{EPAI-PLC_COMMUNICATION_APP}: PLC Communication Tools package},
  author  = {HYCX, Bosch HUAYU Steering Systems, Keyence},
  year={2022}
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇