1. 先弄清楚这套软件在整个开发链条里的位置
拿到一台中大型PLC,很多人的第一反应是"赶紧接线、赶紧上电、赶紧写程序"。我见过不少新手就是这么干的,结果程序写了一半发现设备树没配、任务周期没设、变量地址对不上,前面写的东西推倒重来。所以这一章不急着讲按钮在哪、菜单叫什么,先把InProShop这套工具的定位讲清楚,后面所有操作你才知道自己为什么要这么点。
InProShop是面向中大型PLC平台的编程环境,走的是一套符合IEC 61131-3标准的工程化思路——它不是一个"写梯形图的小工具",而是一个把硬件组态、逻辑编程、运动控制、通信配置、在线调试全部装进同一个工程文件的集成平台。你打开它,看到的是一棵树:设备挂在树上,程序挂在设备下,变量挂在程序上。这个结构决定了你后面所有的操作顺序。顺便提一句,这个名字在不同资料里有写作"InoProShop"的,我第一次看到两个写法还愣了半天,后来发现是同一样东西,别被搜索引擎搞晕。
它解决的问题很具体:一台带EtherCAT总线、带多轴运动、带远程IO的控制器,如果硬件配置和逻辑程序分属两套软件,改一个IO点位就要两边同步,出错概率极高。集成到一个工程里,硬件改动直接映射到变量,程序里引用变量名而不是裸地址,这才是工程化的意义。
适合谁看?我的判断是三类人。第一类是刚从传统小型PLC转过来、习惯"地址表思维"的,这类人最需要转变的是从"我给X0写逻辑"变成"我给变量写逻辑";第二类是接手别人工程要维护的,重点是看懂设备树和任务配置;第三类是自己攒设备做小系统集的,需要快速跑通"配置—编程—下载—调试"这条闭环。不管哪一类,软件基本使用的核心不是记菜单,而是建立"工程结构感"。
提示:如果你之前用过其他基于IEC 61131-3的编程环境,上手会很快,因为术语体系基本一致;但千万别把别人的操作习惯整套搬过来,任务配置、变量作用域、在线修改的安全机制,各家细节差别不小,照搬容易踩坑。
2. 安装与工程建立:地基没打牢,后面全是返工
2.1 版本匹配这件事,比你想的重要
安装这一步最容易被轻视。我踩过的最典型的一个坑是:软件版本比控制器固件新太多,工程能编译、能下载,但一进在线监控就提示设备信息读取异常,折腾了半天以为是网线问题。后来换成与固件匹配的软件版本,一次通过。
所以第一条硬规矩:软件版本、控制器固件版本、编程库版本,三者要对得上。工程建立前先做三件事——看控制器铭牌上的型号和固件标识,查该固件的适配软件版本区间,确认工程里要用的功能块库在这个版本里存在。很多人只做第一件事,后面两件全靠运气。
安装过程本身没什么技术含量,但有几点实操细节值得说:
- 安装路径不要带中文和空格。这不是玄学,很多工程软件内部调用编译器时路径解析会出问题,编译莫名失败往往就是这里。
- 安装前关掉所有可能占用串口和网口的调试工具。有些工具后台常驻,装完软件后通信扫描不到设备,八成是被占了。
- 装完后先别急着新建工程,打开软件看看有没有自带的示例工程或设备描述库。这一步能帮你确认安装完整性。
- 如果同一台电脑要装多个版本,注意安装顺序和独立目录,别覆盖。工程文件在不同版本间不一定能无损打开,这个风险要提前防。
2.2 新建工程时的几个关键选择
新建工程弹出的对话框,大多数人一路"下一步"。但这里面有几个选项会决定后续的麻烦程度,值得停下来想三十秒。
设备型号选择:必须与实物严格一致。选错型号最典型的后果是IO点数对不上、可用的轴资源数量不对。有些型号在选项里名字很像,只差一个后缀,看仔细。
编程语言选择:这决定了工程的默认POU用什么语言。我的建议是主程序用梯形图或结构化文本,看团队习惯;但功能块(FB)尽量用结构化文本写,因为带状态、带参数、需要复用的逻辑,用梯形图维护成本会越来越高。这不是偏好问题,是可维护性问题。
任务配置:默认会生成一个主任务。绝大多数工程直接用它就行,但它的周期参数要留意。给一个简单判断:普通逻辑控制用默认周期足够;如果有高速计数、快速响应的轴使能信号,就要单独建一个短周期任务,并把相关逻辑放进去。把所有逻辑都堆在默认主任务里,是新手最常见的结构性问题。
工程命名与存储位置:工程文件名别用中文,别放在同步盘目录里。同步盘在工程保存时会锁文件,导致保存失败甚至工程损坏,这个坑我见过至少两次,损失的都是几天工作量。
2.3 工程目录里都有什么
工程保存后是一个文件夹,里面能看到几个部分:工程主文件、编译生成的中间文件、备份文件、还有可能的库引用记录。理解这些能帮你做两件事。
第一是备份。我的习惯是每次大改动前,把整个工程文件夹复制一份,重命名成"项目名_日期_改动说明"。别只依赖软件自带的自动备份,自动备份的恢复入口不明显,急的时候找不到。
第二是排错。编译报错有时候指向的是中间文件的问题,不是你的代码。遇到"清理后重新编译就好了"的情况,说明是中间文件残留,这时候删掉编译输出目录再重新生成往往更快。
注意:工程文件夹里如果有你自己放进去的文档、图片,编译时可能被当成资源打包,导致工程体积异常。资料文档单独建目录放,别混在工程里。
3. 界面与核心概念:先搞懂它怎么组织代码
3.1 一棵树看懂整个工程结构
打开工程,左侧是一棵设备树。这棵树的层级逻辑是:
顶层是设备(控制器本体),设备下面是PLC逻辑区,逻辑区里包含应用(Application),应用里挂任务配置、全局变量、程序组织单元、数据类型、可视化等。这个层级的每一层都不是装饰,改错层级会直接导致程序不执行。
举个我实际遇到的例子:有人把一段逻辑写在了新建的POU里,但忘了在任务配置中把这个POU添加进去,结果编译没有任何报错,下载也成功,就是这段程序永远不跑。他花了一晚上查IO接线,最后发现问题在任务配置。编译通过不等于程序会运行,这是理解工程结构最重要的一句话。
所以看一个陌生工程,我的顺序是:先看任务配置里挂了哪些程序、周期是多少;再看全局变量表;最后才看具体逻辑。顺序反了,你会在几百行代码里迷失。
3.2 POU、任务、变量三者的关系
这三个概念是这套软件的核心,用生活化的说法打个比方:POU是菜谱,任务是出菜的时间表,变量是食材。
POU(程序组织单元)分三种:
| 类型 | 说明 | 典型用途 |
|---|---|---|
| 程序(PRG) | 可直接被任务调用 | 主流程、设备控制逻辑 |
| 功能块(FB) | 有内部状态,可多次实例化 | 电机控制、阀控制、报警处理 |
| 功能(FC) | 无内部状态,执行完即返回 | 数学运算、单位换算、数据转换 |
功能块和功能的区别,新手最容易混。判断方法很简单:这段逻辑需不需要记住上一次的状态。电机的启动、停止、故障锁存,需要记住状态,用FB;把摄氏度换成华氏度,每次输入输出一一对应,用FC。用错不影响编译,但会导致奇怪的行为,比如你把带状态的自锁逻辑写成FC,每次调用状态都清零,锁不住。
任务配置决定这些POU什么时候执行、多久执行一次。这里有个参数要特别说:任务周期和看门狗。周期设得太短,扫描时间不够会触发看门狗报错;设得太长,响应迟钝。经验值:普通逻辑控制10毫秒左右比较从容;带高速处理的放到1毫秒任务里,但要先测一下最坏执行时间,留足余量。看门狗时间不要贴着任务周期设,我一般留三倍以上,宁可报警晚一点,也别让控制器直接停机。
3.3 变量命名和地址映射,别偷懒
变量这一块,是我看过最多"前人挖坑后人跳"的地方。
先说地址映射。传统小型PLC的思路是直接写X0、Y0、M0,这套软件里也能这么做,通过AT声明把变量绑到物理地址上,比如某个输入点绑到%IX0.0。但更推荐的做法是:物理地址只在全局变量表里出现一次,程序里全部用变量名。
为什么?因为一旦硬件改点位,你只需要改全局变量表里那一行,程序里几十处引用自动跟着变。反过来,如果程序里到处裸写地址,改一个点要全文搜索替换,漏一处就是现场故障。
命名规范我建议强制统一,团队里谁都不许自由发挥:
- 输入用
I_开头,输出用Q_,内部中间变量用M_,模拟量用AI_/AQ_。 - 后面跟设备代号和功能,比如
I_Station1_PhotoSensor。 - 数据类型跟着语义走,别全用BOOL糊弄,模拟量该用INT/REAL就用。
变量作用域也要留意。全局变量在整个应用里可见,局部变量只在所属POU内可见。原则是:能局部就局部,全局变量越少越好。全局变量泛滥的工程,后期排查"这个值谁改的"几乎无解。
4. 第一个能跑的程序:从写代码到下载调试
4.1 写一段最朴素的启保停
不讲理论,直接上手。新建一个程序POU,语言选梯形图,写一段最基本的启保停,变量全部在全局表里声明好:启动按钮输入、停止按钮输入、接触器输出、一个中间保持位。
梯形图里就三个网络:启动按钮和保持位并联、串联停止按钮的常闭、输出线圈。这段逻辑任何人都写得出来,但它能验证整条链路是通的:
- 变量声明是否正确(类型、作用域)
- 程序是否挂到了任务配置
- 编译是否通过
- 通信是否连通
- 下载后是否进入运行态
- 输入信号是否真的映射到了那个变量
我建议第一次一定用实物输入点测试,哪怕只是用一根导线短接输入端子。因为如果用强制功能模拟输入,你会跳过"物理地址映射是否正确"这一环,而这恰恰是最容易出错的地方。
4.2 编译、下载、运行,每一步都有讲究
编译分增量编译和全编译。日常改动用增量,速度快;但遇到莫名报错、或者改动了数据类型定义、或者从别人那里拿来的工程,一定用全编译。全编译能把交叉引用、类型冲突这些问题暴露出来。我个人的习惯是每天开工先全编译一次,确认基线是干净的。
下载前必须确认的三件事:控制器处于可下载状态、工程里的设备型号与实物一致、当前没有别的电脑连着同一台设备。第三点听起来好笑,但产线调试时两个人同时连一台PLC,互相把对方踢下线的事故不少见。
下载方式上,走以太网是主流。流程是:设置电脑网卡与控制器同网段(举例:电脑设为192.168.1.100,掩码255.255.255.0,控制器出厂地址通常写在铭牌或手册里),然后在软件里扫描设备,扫到之后建立通信路径。扫描不到设备,九成是网段不对或防火墙拦截,先排查这两项,别急着怀疑硬件。
下载完成后,控制器不一定自动进入运行态。要手动切到运行,然后确认运行指示灯或者软件里的状态显示。这一步漏掉,就会出现"程序明明下载了却不动作"的经典困惑。
4.3 在线监控和强制,用好了是利器,用错了是事故
在线监控的价值在于能看到每个变量的实时值、每个梯级网络的通断状态。我的使用习惯是:先在监控里逐个确认输入信号,按一下按钮看对应变量是否翻转,不翻转就是接线或地址映射的问题,翻转了再往下查逻辑。
写入值(Write Value)和强制(Force)的区别必须搞清楚:
| 操作 | 作用范围 | 持续时间 | 风险 |
|---|---|---|---|
| 写入值 | 单次写入当前值 | 下一个扫描周期可能被程序覆盖 | 较低,适合调试观察 |
| 强制 | 锁定变量值,程序无法改写 | 直到取消强制 | 高,残留强制是重大隐患 |
注意:强制功能是现场事故的高发点。用完必须立刻取消,并且养成"下载新程序前检查是否存在残留强制"的习惯。有些工程设置了强制列表查看入口,每次上线前扫一眼,这个动作能救命。
还有一个容易被忽略的点:在线修改。改了逻辑之后可以在线下载增量,控制器不停止运行。这很方便,但改了变量声明、改了任务配置、改了设备树,通常需要完整下载并停机。分不清这两种情况,现场就容易出现"改了没生效"或者"设备意外停机"。
5. 常见问题与排查技巧实录
5.1 编译类问题:报错信息要看全
新手看编译报错,往往只看第一行。实际上编译输出窗口的完整信息里,通常包含出错的文件、行号、以及更具体的描述。几个高频报错:
- 变量未定义:九成是拼写错误,或者变量声明在另一个POU的局部作用域里。全局变量用不了的时候先确认它是不是被声明成了局部。
- 类型不匹配:把INT直接赋给REAL不会自动转换,需要显式转换。这类问题在模拟量处理里特别多。
- 重复定义:同一个名字在两个地方声明了。这种情况全编译能定位,增量编译有时会漏。
- 库引用缺失:工程用到了某个功能块库,但当前环境没装或者版本不对。表现是编译通过但下载后功能块不工作,很隐蔽。
5.2 通信类问题:按层排查,别乱试
通信连不上是最耗时间的问题。我总结的排查顺序是自下而上:
- 物理层:网口灯亮不亮、网线是不是好的、有没有经过交换机。用一根直连网线先排除中间设备。
- 网络层:电脑IP和控制器IP是否同网段、掩码是否一致、有没有IP冲突。用系统自带的ping测试,能ping通说明物理和网络都没问题。
- 软件层:通信路径配置对不对、防火墙有没有拦、有没有别的进程占用。有些安全软件会把工程软件的通信端口当成可疑流量。
- 设备状态:控制器是不是处于故障停机、有没有报错、是不是被设成了别的通信模式。
EtherCAT从站扫描不到是另一个高频场景。首先要确认从站的设备描述文件(XML格式)已经导入到软件的正确目录,没导入的话设备树里根本添加不了这个型号。其次检查接线顺序,EtherCAT是链形拓扑,中间断一环后面全掉。最后看从站地址和拓扑是否与实际一致。这类问题用"逐段短接法"排查最快:从第一个从站开始,一个个往上加,加到哪个掉线就是哪个的问题。
5.3 运行类问题:程序跑了但不对劲
这类问题最考验功底,因为没有报错,只有"行为不符合预期"。我的排查清单是这样的:
- 程序真的在跑吗:看任务配置里的程序是否被调用,看扫描计数是否在增长。
- 变量被谁改了:用交叉引用功能查这个变量的所有写入点。交叉引用是这套软件里最被低估的功能,比一行行读代码高效十倍。
- 时序对不对:多任务环境下,短周期任务和长周期任务的数据交换要留意。长周期任务读到的可能是上一轮的值,这种时序问题在监控里看不出来,只能靠分析。
- 初值问题:变量声明时给了初值,但控制器里保存着上次运行的值,下载时如果选择保留保持性变量,新初值不生效。这个坑非常隐蔽。
5.4 一个速查表
| 现象 | 最可能原因 | 优先排查动作 |
|---|---|---|
| 扫描不到设备 | 网段不符/防火墙 | ping测试、临时关闭防火墙 |
| 下载提示型号不匹配 | 工程设备型号与实物不一致 | 核对铭牌与工程设备属性 |
| 编译通过但逻辑不执行 | POU未挂任务 | 打开任务配置检查调用列表 |
| 输入信号监控不翻转 | 接线错误或地址映射错 | 短接端子测试、核对AT声明 |
| 模拟量数值跳变剧烈 | 未做滤波/量程设置错 | 检查滤波参数与量程上下限 |
| 修改后行为未变化 | 增量下载未生效/有残留强制 | 全编译完整下载、清强制 |
| EtherCAT从站掉线 | 拓扑中断/描述文件缺失 | 逐段排查、检查XML导入 |
6. 效率技巧与工程管理,这些没人会主动教你
6.1 把快捷键和自定义模板用起来
软件用久了,效率差距主要在手上。几个值得花时间记的:编译、下载、登录在线、切换监控视图,都有默认快捷键,在菜单里能看到。建议头一周强迫自己用快捷键,后面就是肌肉记忆。
比快捷键更有价值的是自定义功能块模板。把电机启保停、阀门控制、报警汇总、模拟量缩放这些反复用的逻辑,写成标准功能块,存成库文件。下一个工程直接引用,不用重写。这件事的收益是复利式的:写一次,用几十次,而且因为反复验证过,可靠性比每次现写高得多。
我做这套模板的时候犯过一个错:功能块接口设计得太"贴合当时那个项目",加了一堆特定参数,结果换项目就不能用。后来改成只保留最通用的输入输出(使能、命令、反馈、故障、状态),项目特定的东西在外面拼,复用率立刻上去了。接口越通用,复用越彻底,这是设计功能块的第一原则。
6.2 版本管理,别等丢了才后悔
工程软件的版本管理不像代码那样有成熟的工具链,但基本动作必须做:
- 每天收工前,把整个工程目录复制一份,命名带日期。
- 每次大的结构改动前,单独存一个版本,并在文件名或工程注释里写清楚改了什么。
- 交付给现场之前,导出一份完整的工程归档,包括库文件。
- 现场改过的程序,一定要回收,别让现场版本和办公室版本分叉。
我见过最惨的一次是现场调试改了三天,工程师的笔记本硬盘坏了,工程没备份,只能凭记忆重写。工程文件不是代码,它是资产,这个心态要有。
6.3 上线前的自查清单
最后分享一份我自己用的上线前检查清单,每次下载到现场设备前过一遍:
- 全编译无警告(警告也要看,很多隐患藏在警告里)。
- 任务配置里没有多余的测试程序。
- 全局变量表里没有遗留的调试变量。
- 所有强制已取消,强制列表为空。
- 保持性变量的初值是否符合本次上线要求。
- 通信参数、从站配置与实际设备一致。
- 工程已备份,备份文件可正常打开。
这份清单看起来啰嗦,但每一条我都见过对应的现场事故。软件基本使用这件事,说到底不是"会用菜单",而是知道哪些地方会出事、哪些动作能提前拦住。这套软件的学习成本主要不在功能本身,在于工程习惯的养成——前期多花两天把结构理清楚,后面省下的是两个月。
我个人在实际操作中的体会是:刚接触这套软件的时候,别急着写复杂逻辑,先花时间把设备树、任务配置、变量作用域这三块彻底摸透。这三块搞明白了,剩下的都是查手册能解决的事;这三块稀里糊涂,写再多代码也是在沙子上盖楼。