如何编写一个能被看懂的PLC程序
编写一个能被看懂的PLC(可编程逻辑控制器)程序,关键在于清晰性、逻辑性和可读性。以下详细介绍如何编写这样的PLC程序:
1. PLC基本原理:学习PLC的工作原理,了解PLC的输入输出模块和它们的工作方式。
2. 编程语言:PLC常用的编程语言包括梯形图(Ladder Logic)、指令列表(Instruction List,IL)、结构化文本(Structured Text,ST)、功能块图(Function Block Diagram,FBD)、序列函数图(Sequential Function Chart,SFC)等。选择适合项目需求的编程语言。
3. 组态软件:熟悉所使用的PLC品牌的组态软件,这是编写和调试PLC程序的重要工具。
1. 功能需求:明确PLC程序需要实现的功能,如交通信号灯控制、电梯控制等。
2. 输入输出:确定PLC的输入信号(如传感器信号、按钮信号)和输出信号(如指示灯、电机控制信号)。
3. 控制逻辑:根据功能需求和输入输出信号,设计控制逻辑。
1. 结构清晰:将程序划分为多个功能模块或子程序,每个模块实现特定的功能。
2. 注释详细:在程序中添加注释,解释每个指令或模块的作用,以及它们如何协同工作以实现整体功能。注释应简洁明了,易于理解。
3. 逻辑严谨:确保控制逻辑正确无误,避免出现逻辑错误或矛盾。
4. 优化代码:在不影响程序可读性的前提下,尽量简化代码,提高执行效率。
以梯形图为例,编写一个简单的PLC程序:
1. 绘制梯形图:使用组态软件或手绘方式,绘制梯形图。梯形图由触点、线圈和连接线组成,用于表示控制逻辑。
2. 触点:表示输入信号或内部条件。当触点闭合时,表示条件满足,可以执行相应的动作。
3. 线圈:表示输出信号或内部状态。当线圈被激活时,表示执行相应的动作或改变状态。
4. 连接线:用于连接触点和线圈,表示控制逻辑的路径。
1. 模拟测试:在组态软件中进行模拟测试,验证程序的正确性。通过模拟输入信号,观察输出信号是否符合预期。
2. 现场调试:在实际控制系统中进行调试,确保PLC程序能够正确运行并实现预期功能。
3. 故障排查:在调试过程中,如果遇到故障或问题,应仔细分析故障原因,并采取相应的措施进行排查和解决。
在PLC控制器和伺服驱动器的装配拉杆的应用上,苏州维本工程塑料Wintone Z63强韧低吸湿、耐磨耐腐蚀、高流动高熔接痕强度材料可以帮助解决传统的尼龙、POM、PP等常规材料可能出现的以下问题:
1.尼龙66和尼龙6材料,吸水性较大,力学性能受水份影响比较大,在干燥的环境和冬天温度较低的情况下,易脆断的问题;
2.POM材料刚性很好,但韧性不够的问题,以及长期使用温度超过80摄氏度时,易老化的问题;
3.PP聚丙烯材料强度不够,纤维增强之后又比较脆的问题。
苏州维本Wintone Z63在PLC控制器连接注塑功能件和伺服驱动器的各类注塑功能件的应用上的特点是:强韧、低吸湿、耐磨、耐腐蚀、优异的高低温性能、高流动易注塑加工、高熔接痕强度。
1. 程序文档:编写详细的程序文档,包括程序的功能描述、输入输出信号、控制逻辑、注释说明等。
2. 技术手册:整理PLC的技术手册和相关资料,供后续维护和升级时参考。
1. 统一命名规范:为变量、模块和子程序命名时,采用统一的命名规范,以提高代码的可读性。
2. 使用模块化设计:将程序划分为多个模块,每个模块实现特定的功能。这样不仅可以提高代码的可维护性,还可以提高代码的可读性。
3. 避免复杂逻辑:尽量简化控制逻辑,避免使用过于复杂的指令或表达式。这样可以降低程序的理解难度,提高可读性。
4. 保持代码整洁:定期整理代码,删除无用的指令或注释,保持代码的整洁和有序。
总之,编写一个能被看懂的PLC程序需要注重清晰性、逻辑性和可读性。通过了解PLC基本知识、明确程序需求、编写结构清晰且注释详细的程序、进行测试和调试以及编写文档和资料等措施,可以编写出高质量的PLC程序。
苏州维本工程塑料有限公司——您身边的工程塑料创新应用开发伙伴。
5.程序编辑和导入
下面就进行程序编辑或者导入程序去加工。对好刀以后可以把刀具移出来,不要让它再接近了。如果不想移就回个原点,重新再回个原点,x回个原点,这样就快点,比用手移动的时候要快点。
下面要去编程,编程有两种方法。
·一种是在这个地方直接用这个键按钮去输入,一个是导入外部程序。导入外部首先可以选择编辑模式,鼠标放在这个按钮上是编辑模式,点击pro格按钮会切换到城市界面。
·在这个位置首先看第一种方法,怎么在这个地方直接输入程序?
→首先输入程序的第一步要输起个程序名,比如o幺零零幺,输入o幺零零幺,点击音色的插入,或者用键盘去输入,点击音色的插入也是一样的,不用鼠标点,用键盘上的去点也是一样的。
→下面程序名下面要换行了,换行要加一个分号,不加分号不会换行的,会把程序上写在程序名的后面,不会换行。但是如果加一个分号,ub就是分号或者键盘上的分号键,点击音色的插入。
→输入分号以后下面继续输,比如t零幺零幺,点击ueob,银色的插入。比如再输入m零三诅咒正转s一千转,再输入g零零,比如x6十z,z多少z,z五,插入就行了。
要讲一下x6十z五或者x多少多少,后面要不要加小说点,加不加无所谓,看个人习惯,因为个人习惯就喜欢加,如果没有这个习惯可以不加。为什么?可以加可以不加主要取决于设置里面有一些系统,比如有一些叫法兰克系统,法兰克系统这里会有,如果没有小说点是以千分之一毫米来去计算的。
如果把这个勾勾上了,编程中一定要加小说点,如果不加速小说点是以千分之一毫米来去计算的,所以整个尺寸都不对。但是默认的情况下是没有勾的,没有勾加不加无所谓,这样就是按照像现在这个方法一步一步的把所有的程序输完。
·还有一种方法就是导入外部程序,比如用咖色的数控车数控洗自动编的程序,给它生成nc或者tst格式就可以把它导入进来。
导入程序有这么几步,过程步骤比较多,这里就讲慢一点,老师看这个视频的时候可以多看几遍。怎么去导入外部程序?
·第一步,要点击编辑模式。
·第二步,点击pro按钮。
·第三步,点击操作。就是软件盘上的操作。
·操作完了之后第四步点击向右的箭头往后翻一页。
·第五步就点击f检索,点击f解锁,它会弹出一个窗口。弹出一个窗口是干什么?就是让你找到程序放在哪里的。比如程序放在了桌面上,放在这桌面上,哪个文件夹?找一找,比如这个文件夹学习资料里面,培训案例里面这是第五步了。
·找到车贴,找到这个程序,nc或者tc的这种程序不能直接放在桌面的,要在桌面建一个文件夹给它丢在文件夹里去,不能直接丢在桌面,直接丢在桌面这里是找不到的。这是第五步了。
·第五步弹出窗口是第五步了。第五步了找到程序,然后点击打开,点击打开这是第五步了。
·第六步给它起个名字,起个什么名字?比如10001,这个名字重复了,没关系这是第六步了,起个名字。
·第七步点击re的读取。
·第八步最后一步点击显示,因为名称是重复的,如果没有重复就直接显示了,如果重复会问你是不是覆盖我们,这样程序就导完了,总共是八个步骤。
·再回顾下哪八个步骤。
→第一步点击编辑模式。
→第二步点击pro格按钮切换到城市界面。
→第三步点击操作。
→第四步向右翻一页。
→第五步点击f检索,然后找到要导的程序,点击打开就行了。
→第六步就是给它起个名字叫o,起个名字。
→第七步点击re的读取。
→第八步读取完成以后再点击ex、e、c,显示这是第八步就可以了。
这总共是八步八个步骤。
如果程序输完之后有些程序不对怎么去修改?修改就用上下左右键,上下左右键去找,把光标调到要改的位置,比如改成s1000,想转速改大的比如改s1000,改s1000,改完之后就输入s1000,然后点击alt,alt就替换,alt、e、r替换就行了。
如果要在程序中间再差一行怎么办?差一行就直接把它调到程序上面这一行的最后一个分号上,比如g000x60.0,比如要把这一行插入到n00020和n00030的中间,把光标调到n00020最后一个分号上,输入指令之后点击隐形的插入,就会在这个地方插入。插入一行如果不想要了先删除怎么办?删除就光标选中,点击delete删除,删除再删除就删除了,这样就是修改程序。
这个就是软件讲的怎么去编程,怎么去导入外部程序,主要就是导入程序程序比较多,导入好的程序后面就可以加工了,下个视频再讲。
这里就讲这么多,如果程序有很多,可不可以一下导入好几个程序进来?可以的,只要程序不重复就不会覆盖。不会覆盖以后点击编辑模式,这里有个l、i、b,点击l、i、b,这里会有一个程序一览表,现在这里只有一个程序,如果这里导入十个八个程序,只要名称不一样,名称不一样都会排列在这里。
最后想用的时候只要输入o、幺、零、零、幺,就是输入要调用的程序,点击o解锁就可以把它调出来,只要用哪个就解锁放哪个就可以了。
这个就是车床的车学加工中程序怎么去编辑,怎么去导入的操作,在软件中怎么去操作,就介绍到这里。
C++编程自学宝典:如何编写一个简单的项目程序?
1.5编写一个简单的项目程序
这个项目将向读者演示在本章学到的C++语言和项目管理的特性。该项目将使用若干源代码文件,以便读者可以了解到依赖项的作用,以及构建工具是如何管理源代码变更的。这个项目非常简单,它将要求你输入名字,然后在命令行上打印输出名字以及相关的时间和日期。
1.5.1项目结构
该项目包含3个函数: main函数,它会调用其他另外两个函数print-name和print_time 。它们分别位于3个独立的源代码文件中,因为 main函数将调用位于其他源代码文件中的两个函数,这意味着main 函数源代码文件中必须包含这些函数的原型声明。在本示例中,这意味着引用每个文件的头文件。该项目还会使用一个预编译头文件,这表示存在一个源代码文件和一个头文件。总之,项目中将包含3个头文件和4个源代码文件。
1.5.2创建预编译头文件
该代码将使用C++标准库的流对象进行信息的输入和输出,因此我们将使用<iostream)头文件。代码中将使用C++的字符串类型处理信息输入,因此还将使用<string> 头文件。最后,它会访问C运行时库的time 和date 函数,因此代码中还将用到<ctime>头文件。这些都是标准的头文件,我们在进行程序开发时无需对它们进行修改,因此它们是预编译的理想目标。
在Visual Studio中创建一个C++头文件,然后在其中添加如下代码:
新建一个C++源代码文件,添加一行代码来引用刚才创建的头文件:
将其另存为utils.cpp ,我们将需要为这个项目创建一个 makefile ,因此在新建文件对话框中,选择文本文件作为文件类型。添加以下规则来构建预编译头文件:
将它另存为文件名为\”makefile.\”的文件,注意要在文件末尾加一个句点( . )符号。因为我们是以文本文件的形式创建该文件的, Visual Studio将自动为它添加一个txt文件后缀,但是因为我们不希望使用该文件后缀,所以需要添加一个句点以表明该文件无后缀名。其中第一行表示utils.pch和utils.obj依赖于特定的源代码文件和头文件。第二行(以一个制表符作为前缀)告知编译器去编译C++文件,但是不调用链接器,同时还告知编译器将预编译代码保存到utils.n文件中。该命令将创建utils.pch和
utils.obj文件,即声明的两个目标。
当make实用程序发现有两个目标时,默认的动作(当目标和依赖项之间使用单个冒号时)是为每个目标都调用一次命令(你可以使用宏来决定哪个目标需要被构建)。这意味着相同的编译器命令将执行两次。这是我们不希望看到的,因为两个目标是通过调用一次命令构建的。双冒号:是一个变通方案,它告知nmake不要采用为每个目标调用命令的行为。最终的结果就是,当make程序调用命令一次,并生成了utils.pch文件,然后它会尝试生成utils.0bj文件,不过它发现该文件已经被生成了,所以不需要再次调用命令。
现在测试输出结果。在命令行中,导航到项目文件夹下,输入nmake命令。
如果没有提供makefile的名称,程序维护工具将自动使用名为makefile的文件(如果你希望使用一个其他名字的makefile ,可以使用/f开关并指定文件名) :
查看文件目录列表,以确认utils.pch和utils.obj文件是否已经被创建。
1.5.3创建主文件
现在创建一个C++源代码文件并添加如下代码:
将此文件另存为main.cpp。
其中引用第一个文件是标准库头文件的预编译头文件。其他两个文件提供了被main 函数调用的另外两个函数的函数原型声明。
现在用户需要为main文件添加一条规则到makefile文件。将下列加粗显示的代码行添加到文件顶
部
新增的一行表示目标文件main.obi 依赖于两个头文件:一个源代码文件main.cpp和一个预编译头文utils.pch 。目前 main.cpp文件将无法编译,因为相关的头文件还不存在。所以我们可以测试
makerile文件,创建两个C++头文件。在第一个头文件中,添加函数原型声明:
将该文件另存为name.n 。在第二个头文件中,添加函数原型声明,例如:
将该文件另存为time.h。
现在我们可以运行make 程序,它将只编译main.cpp文件。测试它的输出结果:通过在命令行中输入del main.obj utils.obj utis.pch命令来删除所有目标文件,然后再次运行make程序。这次,用户将发现make 程序首先编译了utils.cpp文件,然后编译了main.cpp文件。这样的编译顺序是因为首个目标是main.obj文件,但是因为它依赖于utils.pch文件,所以 make程序在返回创建main.obj文件规则之前,移动到了下一个规则并采用此规则生成了预编译头文件
需要注意的是,我们还没有定义print_name 和print_time函数,不过编译器并不会对此有异议。因此编译器只创建对象文件,链接器负责链接函数。头文件中的函数原型声明满足了编译器的要求,该函数将在其他对象文件中被定义。
1.5.4输入和输出流
目前为止,我们已经了解了如何通过cout 对象将数据输出到控制台。标准库还提供了一个cin流对象,允许读取命令行中输入的值。
创建一个C++源代码文件,并添加如下代码:
将该文件另存为name.cpp.
其中首先引用的文件是预编译头文件,这将引用两个标准库头文件,即<iostream)和<string> ,因此我们可以在这些文件中使用类型声明。
函数中第一行的含义是在控制台上打印输出字符串\”Your first name? \”.
注意,在该问题末尾有一个空格,因此光标将保持在同一行,等待输入信息。
接下来的一行声明了一个C++字符串对象变量。字符串可以包含0个或者多个字符,并且每个字符都会占用内存。字符串类会处理字符串相关的分配和释放内存的所有工作,该类将在第9章详细介绍。cin重载了运算符》>以便获取控制台的输入信息。当用户按下回车\”键之后,运算符>>将把输入内容传递给变量name (将空格字符视为分隔符)。
该函数会将变量name中的内容打印输出到控制台,并且不带换行符。
现在为该源代码文件添加一条规则到makefile中,即添加如下代码到该文件的顶部:
保存该文件,然后运行make工具,以确认它是否生成了name.obj目标文件。
1.5.5 time函数
最终的源代码文件将会获取时间,并将它打印输出到控制台。创建一个C++源代码文件并添加如下代码
行:
sta::time 和std::gmtime 这两个函数是C函数,并且std:time_t 是一个C类型,所有这些都是通过C++标准库获得的。std:time 函数获取的时间是1970年1月1日午夜以来的秒数。该函数会返回一个std::time_t类型的值,即一个64位整数。如果用户通过指针传递变量在存储中的存储位置,则该函数可以将上述整数值拷贝到另外一个变量中。
在这个示例中,我们不需要这个工具,因此我们传递一个C++的nullptr 给该函数,以声明不需要执。行拷贝操作。
接下来,我们需要将秒数转换成包含时间和日期的字符格式,以方便用户理解。这也是std::ctime函数的主要用途,它会接收一个指向保存秒数变量的指针作为参数。变量now保存了秒数,运算符&用于获取变量的内存地址。第4章将详细介绍变量和指针的细节。 std::ctime函数会返回一个字符串,不过我们还没有为该字符分配任何内存,也不应该尝试为该字符串分配内存。 std:ctime 函数创建了一个静态分配内存缓冲区,它将被运行在当前执行线程的所有代码共享使用。每次在相同执行线程上调用std:ctime函数时,使用的内存地址是一样的。不过内存中的内容可能会发生变化。
此函数说明检查帮助手册,查看谁负责分配和释放内存是非常重要的。第4章将详细介绍分配内存的细
节。
从std:ctime返回的字符被打印输出到控制台,并且是通过调用若干次运算符<<对输出结果进行格式化的。
现在给makefile添加一条构建规则,即添加如下规则到该文件顶部:
保存该文件并运行make工具,然后确认该构建过程是否生成了time.obj 目标文件。
1.5.6构建可执行文件
现在我们已经拥有了项目所需的所有对象文件,因此下一个任务是将它们链接到一起。为此,将下列代码添加到makefile文件顶部
这里的目标是可执行文件,并且依赖项是4个对象文件。命令行中为了构建可执行文件会调用链接器并使用特殊的语法。标识符$@会被make工具解析为使用目标,所以/out开关实际的内容是
/out:time_test.out 。标识符$**会被make工具解析为使用所有依赖项,因此所有依赖项都将被链接。
保存该文件并运行make程序。用户将发现只有链接器被调用,并且它将链接所有对象文件继而创建可执行文件。
最后,添加一条规则来清理项目。提供一种机制移除编译过程中生成的文件,只保留源代码文件,从而保持项目结构的整洁是一个非常好的习惯。在链接对象文件的代码行之后,添加如下代码:
clean任务是一个伪目标,实际上并没有生成文件,因此也不存在依赖项。这说明了make程序的个特性,如果调用mmake工具,并指定目标名称,那么该程序将只生成该目标。如果没有声明目标,那么该程序将生成makefile提及的第一个目标,在这种情况下是time_test.exe
clean 伪目标包含3个命令:第一个命令会将\”Cleaning the project.打印输出到控制台,标识符e会告知命令行不要将该命令打印输出到控制台;第二个和第三个命令会调用命令行工具de1删除文件。现在可以在命令行上输入 mmake clean 命令清理项目,然后确认项目目录下是否只包含头文件、源代码文件和makefile文件。
1.5.7 测试代码
再次运行make程序,以便构建可执行文件。在命令行中,可以通过输入time_test命令运行示例程序。你将被要求输入姓名;执行此操作,然后按回车\”键,此时将发现自己的名字、当前时间和日期被打印输出到控制台上:
1.5.8 修改项目
现在读者对基本的项目结构有所了解,通过makefile ,你可以对文件进行修改,并确保重新构建项目时,只对发生变更的文件进行编译。为了说明这一点,将修改name.cpp 中的 print_name 函数,以更客气的方式询问你的姓名。修改函数体中第一行代码,比如下列代码中加粗显示的代码行:
保存该文件,然后运行make工具。这一次只有源代码文件main.cpp被编译,生成的name.obj文件会与已有的对象文件链接到一起。
现在修改头文件name.h ,并在其中添加一个注释信息:
构建该项目。读者发现了什么?这一次,有两个源代码文件被编译,即name.cpp和main.cpp 。并且它们与已有的对象文件链接到一起,从而创建了可执行文件。为了细究这两个文件被编译的原因,可以查看makefile 中的依赖项规则。唯一发生变更的文件是name.h,并且该文件的名字出现在了ame.obj和main.obj依赖项列表上,因此这两个文件被重新构建。由于这两个文件出现在了time_test.exe的依赖项列表上,所以该可执行文件也将被重新构建。
本文节选自《C++编程自学宝典》
本书旨在通过全面细致的内容和代码示例,带领读者更加全方位地认识C++语言。全书内容共计10章,由浅入深地介绍了C++的各项特性,包括C++语法、数据类型、指针、函数、类、面向对象特性、标准库容器、字符串、诊断和调试等。本书涵盖了C++11规范及相关的C++标准库,是全面学习C++编程的合适之选。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。