ysk001 发表于 2023-3-21 04:58:06

关于ST语言的一些问题

请帮忙写一个电机控制的功能块。
1、要求有远程反馈,运行反馈,故障反馈,手动自动切换模式。
2、当远程反馈为假时手动模式和自动模式失效。
3、当故障反馈为真时,电机停止运行。
4、当处于自动模式是手动模式失效,反之亦然。
5、记录电机运行时间,以小时为单位。

chatGPT_小控 发表于 2023-3-21 04:58:42

以下是一个基础的电机控制的ST功能块代码,根据实际需要进行修改和增加:

```
FUNCTION_BLOCK Motor_Control
VAR_INPUT
    Remote_Feedback : BOOL; (*远程反馈*)
    Manual_Auto_Mode_Select : BOOL; (*手动自动模式选择开关*)
END_VAR
VAR_OUTPUT
    Run_Feedback : BOOL; (*运行反馈*)
    Fault_Feedback : BOOL; (*故障反馈*)
    Motor_Run : BOOL; (*电机运行开关*)
END_VAR
VAR
    Automatic_Mode : BOOL := TRUE; (*自动模式标志*)
    Manual_Mode_Timer : TON; (*手动模式计时器*)
    Motor_Runtime : UDINT; (*电机运行时间计时器*)
END_VAR
(*当远程反馈为假或故障反馈为真时,电机停止运行*)
IF NOT Remote_Feedback OR Fault_Feedback THEN
    Motor_Run := FALSE; (*电机停止运行*)
    Automatic_Mode := TRUE; (*自动模式标志复位*)
    Manual_Mode_Timer(IN:=FALSE); (*手动模式计时器复位*)
    Motor_Runtime := 0; (*电机运行时间清零*)
ELSIF Manual_Auto_Mode_Select THEN (*手动模式*)
    Automatic_Mode := FALSE; (*自动模式标志复位*)
    Manual_Mode_Timer(IN:=TRUE); (*手动模式计时器开始计时*)
    IF Manual_Mode_Timer.Q THEN (*手动模式计时结束*)
      Manual_Mode_Timer(IN:=FALSE); (*手动模式计时器复位*)
      Motor_Run := FALSE; (*电机停止运行*)
      Automatic_Mode := TRUE; (*自动模式标志复位*)
      Motor_Runtime := 0; (*电机运行时间清零*)
    ELSE
      Motor_Run := TRUE; (*电机运行*)
      Motor_Runtime := Motor_Runtime + 1; (*电机运行时间累加*)
    END_IF
ELSE (*自动模式*)
    Automatic_Mode := TRUE; (*自动模式标志复位*)
    Manual_Mode_Timer(IN:=FALSE); (*手动模式计时器复位*)
    IF Motor_Run THEN
      Motor_Runtime := Motor_Runtime + 1; (*电机运行时间累加*)
    END_IF
    Motor_Run := Run_Logic(); (*根据实际需求编写电机启停逻辑*)
END_IF
Run_Feedback := Motor_Run; (*输出运行反馈*)
Fault_Feedback := NOT Motor_Run; (*输出故障反馈*)

(*电机启停逻辑函数*)
FUNCTION Run_Logic : BOOL
VAR
    Run_Flag : BOOL;
BEGIN
    (*根据实际需求编写电机启停逻辑*)
    Run_Flag := FALSE; (*示例:若远程反馈为真且电机运行时间小于10小时,则电机运行;否则停止运行*)
    IF Remote_Feedback AND (Motor_Runtime < 10*3600) THEN
      Run_Flag := TRUE;
    END_IF
    RETURN Run_Flag;
END_FUNCTION
```

需要注意的是,此功能块中的电机启停逻辑函数 `Run_Logic()` 需要根据实际需求编写。同时需要在程序中初始化 `Manual_Mode_Timer` 和 `Motor_Runtime` 变量,并设定计时器预设值和计时器周期。

ysk001 发表于 2023-3-21 13:30:13

可以写python程序吗

chatGPT_小控 发表于 2023-3-21 13:30:52

当然可以,以下是相应的电机控制的Python代码,同样需要根据实际需求进行修改和增加:```class Motor_Control:    def __init__(self):      self.Remote_Feedback = False      self.Manual_Auto_Mode_Select = False      self.Run_Feedback = False      self.Fault_Feedback = False      self.Motor_Run = False      self.Automatic_Mode = True      self.Manual_Mode_Timer = 0      self.Motor_Runtime = 0    def Run_Logic(self):      # 根据实际需求编写电机启停逻辑      # 示例:若远程反馈为真且电机运行时间小于10小时,则电机运行;否则停止运行      if self.Remote_Feedback and (self.Motor_Runtime < 10*3600):            return True      else:            return False    def Motor_Control(self, Remote_Feedback, Manual_Auto_Mode_Select):      self.Remote_Feedback = Remote_Feedback      self.Manual_Auto_Mode_Select = Manual_Auto_Mode_Select      # 当远程反馈为假或故障反馈为真时,电机停止运行      if not self.Remote_Feedback or self.Fault_Feedback:            self.Motor_Run = False            self.Automatic_Mode = True            self.Manual_Mode_Timer = 0            self.Motor_Runtime = 0      elif self.Manual_Auto_Mode_Select: # 手动模式            self.Automatic_Mode = False            self.Manual_Mode_Timer += 1            if self.Manual_Mode_Timer >= 10: # 手动模式计时结束                self.Motor_Run = False # 电机停止运行                self.Automatic_Mode = True # 自动模式标志复位                self.Manual_Mode_Timer = 0 # 手动模式计时器复位                self.Motor_Runtime = 0 # 电机运行时间清零            else:                self.Motor_Run = True # 电机运行      else: # 自动模式            self.Automatic_Mode = True # 自动模式标志复位            self.Manual_Mode_Timer = 0 # 手动模式计时器复位            if self.Motor_Run:                self.Motor_Runtime += 1 # 电机运行时间累加            self.Motor_Run = self.Run_Logic() # 根据实际需求编写电机启停逻辑函数      self.Run_Feedback = self.Motor_Run # 输出运行反馈      self.Fault_Feedback = not self.Motor_Run # 输出故障反馈```需要注意的是,此代码中的电机启停逻辑 `Run_Logic()` 函数需要根据实际需求编写。同时需要在程序中初始化 `Manual_Mode_Timer` 和 `Motor_Runtime` 变量,并设定计时器周期。

ysk001 发表于 2023-3-21 13:33:34

能不我用python写一个ui界面吗?
1、需要一个按钮,一个文本框,一个列表框。
2、当按钮按下时,根据文本框里输入的网址,提取对应网站里面的小说名称、下载地址,返回到列表框里。

chatGPT_小控 发表于 2023-3-21 13:34:11

当然可以,以下是一个简单的Python GUI程序,使用了PyQt库来实现:```import sysfrom PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QTextBrowserfrom bs4 import BeautifulSoupimport requestsclass NovelDownloader(QWidget):    def __init__(self):      super().__init__()      self.initUI()    def initUI(self):      self.resize(500, 500)      self.setWindowTitle(\'小说下载器\')      self.label = QLabel(\'请输入小说主页链接:\', self)      self.label.move(20, 20)      self.edit = QLineEdit(self)      self.edit.setGeometry(20, 50, 200, 25)      self.btn = QPushButton(\'搜索\', self)      self.btn.setGeometry(240, 50, 80, 25)      self.btn.clicked.connect(self.search_novel)      self.list = QTextBrowser(self)      self.list.setGeometry(20, 90, 460, 380)    def search_novel(self):      url = self.edit.text()      headers = {            \'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3\'}      res = requests.get(url, headers=headers)      soup = BeautifulSoup(res.content, \'html.parser\')      novel_list = soup.find_all(\'div\', {\'class\': \'novelslist\'})      novels = []      for novel in novel_list:            title = novel.find(\'li\').text            download_url = novel.find(\'a\')[\'href\']            novels.append((title, download_url))      self.list.clear()      for novel in novels:            self.list.append(novel + \': \' + novel)if __name__ == \'__main__\':    app = QApplication(sys.argv)    nd = NovelDownloader()    nd.show()    sys.exit(app.exec_())```在上述代码中,我们先定义了一个NovelDownloader类继承自QWidget,然后在类的构造函数中初始化UI。在UI中,我们添加了一个QLabel作为提示文字,一个QLineEdit作为输入框,一个QPushButton作为按钮,一个QTextBrowser作为列表框。其中,我们通过btn.clicked.connect(self.search_novel)将search_novel函数与按钮的点击事件关联在一起。search_novel函数中,我们使用requests库发送HTTP请求获取网页内容,然后使用BeautifulSoup库解析网页,提取小说名称和下载地址,并将结果显示在列表框中。最后,我们通过if __name__ == \'__main__\'创建一个应用程序对象并运行。

ysk001 发表于 2023-3-21 14:07:04

帮我写一个西门子wincc vbs脚本,要求如下;
1、在按钮组态事件中,鼠标动作触发。
2、读取二进制变量“DI01”。
3、当按钮有动作时,变量"DI01"为1。
4、当按钮再次有动作时,变量"DI01"为0。

chatGPT_小控 发表于 2023-3-21 14:07:17

以下是根据要求编写的VBScript脚本代码:```Sub Button_Clickevent()    Dim DI01    DI01 = TagRead(\"DI01\")    If DI01 = 1 Then      TagWrite \"DI01\", 0    Else      TagWrite \"DI01\", 1    End IfEnd Sub```这个脚本将在WinCC的按钮组态事件中被触发,读取“DI01”的值并根据按钮动作设置它的值。如果“DI01”的值为1,则将其设置为0,反之亦然。

ysk001 发表于 2023-3-21 14:15:39

帮我写一个西门子wincc vbs脚本,要求如下;
1、在按钮组态事件中,鼠标动作触发。
2、读取二进制内部变量“DI01”。
3、当按钮有动作时,变量"DI01"为1。
4、当按钮再次有动作时,变量"DI01"为0。
5、wincc是7.4版本的。

chatGPT_小控 发表于 2023-3-21 14:15:48

以下是可以在WinCC 7.4版本中使用的VBScript脚本代码:```Sub Button_Clickevent()    Dim DI01    DI01 = Application.ReadVariable(\"DI01\")    If DI01 = 1 Then      Application.WriteVariable \"DI01\", 0    Else      Application.WriteVariable \"DI01\", 1    End IfEnd Sub```注意,WinCC 7.4版本中的内部变量需要使用`Application.ReadVariable`和`Application.WriteVariable`函数来读取和写入。
页: [1]
查看完整版本: 关于ST语言的一些问题