恭喜,你发布的帖子
发布于 2023-06-26 13:39:13
4楼
你到底提的是啥问题?C#做的有问题,你是控制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
请填写推广理由:
分享
只看
楼主