• обязательно заполнить свой профиль на русском языке кириллицей
  • не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему
  • дублирование сообщений приравнивается к спаму
  • за поиск и предложение пиратского ПО - бан без предупреждения
  • рекламу и частные объявления мы не размещаем ни на каких условиях

Сброс значений в SQL по времени

Ответить

Автор темы
stesl
здесь недавно
здесь недавно
Сообщения: 14
Зарегистрирован: 31 мар 2018, 12:05
Имя: Вячеслав
Благодарил (а): 5 раз

Сброс значений в SQL по времени

Сообщение stesl » 14 июн 2019, 12:37

Всем привет!
Продолжаю красться по пути "хрен его знает"

Как то знаний по VB и его применению в WinCC не прибавляется. Все методом тыка.
Задача: Скинуть значения тэгов в базу (пока Access хотя бы, ибо с MS SQL еще не начинал даже)

Код: Выделить всё

Option Explicit
Function action
  Dim objConnection
  Set objConnection = CreateObject("ADODB.Connection")

  Dim strConnectionString
  Dim databasefile
  Dim strSQL

  databasefile = "C:\Users\SCADA-Ingeniring\Documents\DB1.accdb"
  
strConnectionString = "provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + databasefile
'strConnectionString = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Users\SCADA-Ingeniring\Documents\DB1.accdb;Uid=Admin;Pwd=;"

  objConnection.ConnectionTimeout = 600
  objConnection.Open strConnectionString

'  	strSQL = "insert into Tab1 (Pos, Dat) values ('Tag1', 2.67)"
	strSQL = "UPDATE Tab1 SET Tab1.Dat = HMIRuntime.Tags("Tag1").Read WHERE ((Tab1!Pos)='L_I_SPR')"

  objConnection.Execute strSQL
End Function
Это создано в разделе Action c нужным триггером. Запинается на моменте HMIRuntime.Tags("Tag1").Read мол не могу такого. Из этого Action нельзя теги получать? Уж извините, пока далеко не все понимаю.
Закомментированные команды (обращение к Access ч/з драйвер и вставка в таблицу БД) исполняются. Вопрос только в том, как тег выдернуть (значение).

И еще вопросик, если позволите. Теги структурные и скидывать мне надо *.AVERAGE. К примеру - Tag1.AVERAGE. Если не трудно, накидайте скриптик как сделать выборку по тегам и как использовать имя найденного тэга (ту часть что перед точкой) для адресации к заголовку таблицы БД. Сам синтаксис. Через него не могу пробиться. Впрочем как и со всяким новым языком.


Andreywys
осмотрелся
осмотрелся
Сообщения: 105
Зарегистрирован: 15 сен 2016, 18:47
Имя: Андрей
Благодарил (а): 8 раз
Поблагодарили: 26 раз

Сброс значений в SQL по времени

Сообщение Andreywys » 14 июн 2019, 12:53

Недавно скрипт выкладывал viewtopic.php?f=157&t=12222&p=98546#p98546 , посмотрите.


Автор темы
stesl
здесь недавно
здесь недавно
Сообщения: 14
Зарегистрирован: 31 мар 2018, 12:05
Имя: Вячеслав
Благодарил (а): 5 раз

Сброс значений в SQL по времени

Сообщение stesl » 14 июн 2019, 13:06

Andreywys писал(а):
14 июн 2019, 12:53
Недавно скрипт выкладывал viewtopic.php?f=157&t=12222&p=98546#p98546 , посмотрите.
Спасибо. Это наверно скорее ответ на вторую часть вопроса. Но в целом это скрипт по событию, как я понимаю? Мой Action работает по времени и было бы здорово дополнить его Вашими строчками, с созданием множества (а я так понимаю HMIRuntime.Tags.CreateTagSet ибо знаю на оч. хорошо только Паскаль:), но сможет ли он дотянуться из скрипта в разделе Action до тэгов?

Это пока основной вопрос. В синтаксисе я уверен, но вижу такое
Изображение


winb
осмотрелся
осмотрелся
Сообщения: 186
Зарегистрирован: 31 янв 2017, 08:44
Имя: Маркушин Андрей Геннадьевич
Благодарил (а): 9 раз
Поблагодарили: 32 раза

Сброс значений в SQL по времени

Сообщение winb » 14 июн 2019, 14:18

strSQL - это строка команды на изменение данных, которую вы посылаете в СУБД (Access там или MSSQL - в принципе без разницы). СУБД не знает, что такое "HMIRuntime.Tags("Tag1").Read". Пробуйте собрать строку на стороне скрипта (например - strSQL = "UPDATE Tab1 SET Tab1.Dat = " + СStr(HMIRuntime.Tags("Tag1").Read) + " WHERE ((Tab1!Pos)='L_I_SPR')"), либо используйте параметры SQL-команды


Andreywys
осмотрелся
осмотрелся
Сообщения: 105
Зарегистрирован: 15 сен 2016, 18:47
Имя: Андрей
Благодарил (а): 8 раз
Поблагодарили: 26 раз

Сброс значений в SQL по времени

Сообщение Andreywys » 14 июн 2019, 14:20

Скрипт по времени
Снимок.PNG
У вас нет необходимых прав для просмотра вложений в этом сообщении.


Автор темы
stesl
здесь недавно
здесь недавно
Сообщения: 14
Зарегистрирован: 31 мар 2018, 12:05
Имя: Вячеслав
Благодарил (а): 5 раз

Сброс значений в SQL по времени

Сообщение stesl » 14 июн 2019, 16:00

Andreywys писал(а):
14 июн 2019, 14:20
Скрипт по времени
Снимок.PNG
Мне портала для полного кайфа не хватает :crazy0to:
Изображение
Тут (WinCC 7.4) такого нет.
winb писал(а):
14 июн 2019, 14:18
strSQL - это строка команды на изменение данных, которую вы посылаете в СУБД (Access там или MSSQL - в принципе без разницы). СУБД не знает, что такое "HMIRuntime.Tags("Tag1").Read". Пробуйте собрать строку на стороне скрипта (например - strSQL = "UPDATE Tab1 SET Tab1.Dat = " + СStr(HMIRuntime.Tags("Tag1").Read) + " WHERE ((Tab1!Pos)='L_I_SPR')"), либо используйте параметры SQL-команды
Вроде понимаю. Вроде должно быть как то так

Код: Выделить всё

Option Explicit
Function action

Dim objConnection
Set objConnection = CreateObject("ADODB.Connection")
Dim strConnectionString
Dim databasefile
Dim strSQL
Dim L_I_PRREAL
Set L_I_PRREAL = HMIRuntime.Tags("L_I_PR.REAL")

databasefile = "C:\Users\SCADA-Ingeniring\Documents\DB1.accdb"
  
strConnectionString = "provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + databasefile
'strConnectionString = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Users\SCADA-Ingeniring\Documents\DB1.accdb;Uid=Admin;Pwd=;"Dim L_I_PRREAL
objConnection.ConnectionTimeout = 600
objConnection.Open strConnectionString

'strSQL = "insert into Tab1 (Pos, Dat) values ('L_I_SPR', L_I_PRREAL)"
strSQL = "UPDATE Tab1 SET Tab1.Dat =" + L_I_PRREAL + "WHERE ((Tab1!Pos)='L_I_SPR')"

objConnection.Execute strSQL

End Function
Но наверняка что то с синтаксисом. И вот эти строки

Код: Выделить всё

Dim L_I_PRREAL
Set L_I_PRREAL = HMIRuntime.Tags("L_I_PR.REAL")
добавил Wizard. Read нету, что смущает. Но это потому что стоит оператор Set? Если я ручками добавляю Read, и оставляю в скрипте только эти 2 строчки, то и идет ругань как на моем скрине в пред топике.

Помогите побороть синтаксис.

А с Вашей строкой я что то вообще блужу. Как на Лиспе - одни скобкэ :roll:

PS Поменял строку

Код: Выделить всё

strSQL = "UPDATE Tab1 SET Tab1.Dat =" + CStr(L_I_PRREAL.Read) + "WHERE ((Tab1!Pos)='L_I_SPR')"
Теперь получаю ошибку - "Ошибка в синтаксисе Update". Но если я вместо этой переменной ставлю какое то значение (2.3 например)

Код: Выделить всё

strSQL = "UPDATE Tab1 SET Tab1.Dat =2.3 WHERE ((Tab1!Pos)='L_I_SPR')"
, то скрипт работает. Дак в чем ошибка?...

Отправлено спустя 52 минуты 39 секунд:
Это мука, а не работа )))
Путем тщательного мозгового штурма ответов обоих коллег - истина родилась

Код: Выделить всё

strSQL = "UPDATE Tab1 SET Tab1.Dat ='" + CStr(L_I_PRREAL.Read) + "' WHERE ((Tab1!Pos)='L_I_SPR')"
ОНО в одинарные кавычки должно быть заключено.

Ну кто нибудь... Ну чего нибудь на русском по VBS почитать - без всяких соплей типа для чайников, чисто столпы: синтаксис, преобразования, типы переменных и пр. В чем разница VBS и VBA и т.д.


Andreywys
осмотрелся
осмотрелся
Сообщения: 105
Зарегистрирован: 15 сен 2016, 18:47
Имя: Андрей
Благодарил (а): 8 раз
Поблагодарили: 26 раз

Сброс значений в SQL по времени

Сообщение Andreywys » Вчера, 01:58

Мне портала для полного кайфа не хватает
Думаю, что в Simatic WinCC 7.4 тоже можно сделать.

Код: Выделить всё

Set L_I_PRREAL = HMIRuntime.Tags("L_I_PR.REAL")
String = L_I_PRREAL.Read
и

Код: Выделить всё

String = HMIRuntime.Tags("L_I_PR.REAL").Read
В первом случае вы создаете объект L_I_PRREAL. После чего дергаете его метод read. Метод возвращает строку, которую вы присваиваете переменной.
По сути, обе записи делают одно и тоже.


Читайте https://cache.industry.siemens.com/dl/f ... _en-US.pdf
Ищите в гугле учебник по vbs.


Автор темы
stesl
здесь недавно
здесь недавно
Сообщения: 14
Зарегистрирован: 31 мар 2018, 12:05
Имя: Вячеслав
Благодарил (а): 5 раз

Сброс значений в SQL по времени

Сообщение stesl » Сегодня, 07:44

Ясно, ООП штучки :) Объекты, методы... Так комфортно было со своим Паскалем штанишки протирать...
Спасибо за, пусть и коротенькое, но объяснение чего то существенного.

PS "ОНО" думало это же Bacic мать его, чего там проще то :roll:

Отправлено спустя 15 минут 36 секунд:
И, кстати, при переходе на MS SQL выскочила другая проблема. Сама строка для SQL выглядит не в пример проще

Код: Выделить всё

strSQL = "UPDATE Tab1 SET Dat = 777.666 WHERE Pos='L_I_SVR'" '" & L_I_PRREAL.Read & "
И это работает. А вот

Код: Выделить всё

strSQL = "UPDATE Tab1 SET Dat =" & L_I_PRREAL.Read & "WHERE Pos='L_I_SVR' "
уже только в случае если тэг окажется 0 (ну может и другим целым числом, работаю с СИМ Степ 7, ибо Тег Симулятор WinCC написан какими то наркошами. И целое в СИМ Степ 7 поймать трудно). Причем независимо какой тип Dat я делаю в самой базе. В WinCC тег конечно float. Это аналоговый уровень, чтобы быть точнее.

Пока что склоняюсь к тому, что проблема на стороне MS SQL


Andreywys
осмотрелся
осмотрелся
Сообщения: 105
Зарегистрирован: 15 сен 2016, 18:47
Имя: Андрей
Благодарил (а): 8 раз
Поблагодарили: 26 раз

Сброс значений в SQL по времени

Сообщение Andreywys » Сегодня, 13:17

stesl писал(а):
Сегодня, 07:59
Ясно, ООП штучки :) Объекты, методы... Так комфортно было со своим Паскалем штанишки протирать...
Спасибо за, пусть и коротенькое, но объяснение чего то существенного.
https://www.youtube.com/watch?v=cdX8r3Z ... e=youtu.be
stesl писал(а):
Сегодня, 07:59
И это работает. А вот
Попробуйте вот так:

Код: Выделить всё

strSQL = "UPDATE Tab1 SET Dat =" & CStr(L_I_PRREAL.Read) & "WHERE Pos='L_I_SVR' "
Сименсовский vbs немного другой и то, что работает в обычном, не всегда работает в WinCC

Ответить

Вернуться в «WinCC»