回复:IO口如何保持与上位机C#的持续的、不间断的通信?

已锁定

昔日如诗

  • 帖子

    834
  • 精华

    3
  • 被关注

    10

论坛等级:侠圣

注册时间:2018-04-17

白金 白金 如何晋级?

发布于 2023-06-26 13:39:13

4楼

展开查看
以下是引用莘莘学子在2023-06-26 11:54:21的发言 >3楼

你到底提的是啥问题?C#做的有问题,你是控制PLC还是控制运动控制器呢?

以下是引用昔日如诗在2023-06-25 09:56:17的发言 >0楼:    PLC的IO口...

引用0楼详细内容:

    PLC的IO口与外界的传感器本来就保持着持续的、不间断的通信,只要外界的传感器被触动,PLC就会有响应。比如行程限位的光电开关,马达一旦走到这个限位处,光电开关就动作,PLC的i口就能做出响应。这种响应是不需要我们设置和编程的,是PLC内置的功能。

 但是C#做不到这一点。我们让一台机器运行一个流程,遇到行程限位开关时,C#不会响应。要保持C#与IO口的通信,我目前所知道提建立一个死循环。但是这样太浪费资源了。PLC是不需要建立死循环的,也不要建立任何响应程序。

   我的意思是:i 过程映像存储区是持续地、不间断地监控相应DI物理硬件的,这个不需要我们设置和编程。DI物理硬件的开、关有变化,则 i 自然会变化,我们编程时直接调用 i,比如 i0.1,然后把 i0.1当成一个程序段(比如马达)的启动或者停止。我们只要把 i0.1写进T形图就行,当它为0时,停止马达;当它为1时,启动马达。或者说,i0.1的初始值是零,当DI物理硬件接通后, 我们不要考虑i0.1是否会从0变成1,它就一定会从0变化到1;事实上,做为软件程序的i0.1是与DI硬件同一的。

   但是C#上位机应用PLC里的某个元素,比如M0.1、DB2.DBW0等等,我们不能直接在语句里把M0.1当成启动、停止某个马达的指令,我们不能指望M0.1为0时,就会执行后面的程序以把马达停止;当它为1时又会启动这个马达。我们必须在此之前加上一个持续地、不间继地读取M0.1的语句,如后面所附C#语句。

    While(true)是一个死循环,它必须不断地去读DB2.DBW0(你也可以把它理解成M0.1)的数据,才能保证程序的正常运行。如果不读取,即使第一程序段里的DB2.DBW0(或者M0.1)变了,第二程序段里的DB2.DBW0(或者M0.1)也不会变。但是PLC不一样,DB2.DBW0(或者M0.1)变了,则全局的DB2.DBW0(或者M0.1)都会变。

    我觉得While(true)不好。我发贴来是想问问,有没有更好的持续地、不间断地接收M0.1、DB2.DBW0这些元素的方法?

-------------------------------------------------------------------

         while (true)

                  {

                      int scanningroute = Convert.ToInt16(plc.Read("DB2.DBW0")); //工件编号,即扫描路径

                      txt_ScanningRoute.Text = scanningroute.ToString();


                      int workingstation = Convert.ToInt16(plc.Read("DB2.DBW4"));//工件台编号

                      txt_WorkingStation.Text = workingstation.ToString();

                  }

       DB2.DBW0=DB2.DBW0+1


评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1200系列

共有15586条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。