Value changed script not firing

Hi!

When I uncomment the prodConnection variable, the script is not firing. I don’t know where the error is and how can I diagnose Ignition scripts?

	wert = system.tag.readBlocking(["[default]St20/Pm202/ST20_PM202_UNLOADINGPRODUCT.value"])[0].value #Telegram gotowy do wyslania do MESa
	prod = system.tag.readBlocking(["[default]St20/Pm202/PisanieDoBazyProdukcyjnej.value"])[0].value #Wysylanie sygnalow do bazy produkcyjnej
	test = system.tag.readBlocking(["[default]St20/Pm202/PisanieDoBazyTestowej.value"])[0].value #Wysylanie sygnalow do bazy testowej
	testConnection = system.tag.readBlocking(["[default]AvailabilityDBTest.value"])[0].value #Polaczenie z baza testowa
    #prodConnection = system.tag.readBlocking(["[default]AvailabilityDBProd.value"])[0].value
  
	if currentValue.value == 1: #Sygnal do wyslania telegramu do bazy danych
		if test == 1: #Czy piszemy do bazy testowej i czy jest polaczenie z baza testowa 
			system.db.runUpdateQuery("INSERT INTO QMES_QOPC_IMPORT (NAME, DATUMZEIT, ZEIT_MS, WERT, STATUS) VALUES ('ST20_PM202_UNLOADINGPRODUCT', SYSDATE, 0, '%s', 0)" %(wert),"DB_TEST") #Wyslanie telegramu do bazy testowej
			system.tag.writeBlocking(["[default]St20/Pm202/WriteDone"],[1]) #Wyslanie sygnalu WriteDone
		if prod == 1: #Czy piszemy do bazy produkcyjnej i czy jest polaczenie z baza produkcyjna 
			system.db.runUpdateQuery("INSERT INTO QMES_QOPC_IMPORT (NAME, DATUMZEIT, ZEIT_MS, WERT, STATUS) VALUES ('ST20_PM202_UNLOADINGPRODUCT', SYSDATE, 0, '%s', 0)" %(wert),"DB_PROD") #Wyslanie telegramu do bazy produkcyjnej
			system.tag.writeBlocking(["[default]St20/Pm202/WriteDone"],[1]) #Wyslanie sygnalu WriteDone
		
	if currentValue.value == 0: #Wyzerowanie WriteRequest przez PLC
		system.tag.writeBlocking(["[default]St20/Pm202/WriteDone"],[0]) #Wyzerowanie WriteDone

Siema, is that the full script? If so it is indented one tab too much, unless that was a result of copy and paste to the forum.

You can diagnose by opening your gateway status in a web browser, Status/Logs

Ok, I’ve found the error. The indentation for that line was made by 4 spaces, not 1 tab.

If I may, don’t read and write tags likes this. Do them in just one call:

paths = [
	"[default]St20/Pm202/ST20_PM202_UNLOADINGPRODUCT",	#Telegram gotowy do wyslania do MESa
	"[default]St20/Pm202/PisanieDoBazyProdukcyjnej",	#Wysylanie sygnalow do bazy produkcyjnej
	"[default]St20/Pm202/PisanieDoBazyTestowej",		#Wysylanie sygnalow do bazy testowej
	"[default]AvailabilityDBTest",						#Polaczenie z baza testowa
	 "[default]AvailabilityDBProd.value"
]
wert, prod, test, testConnection, prodConnection = [tag.value for tag in system.tag.readBlocking(paths)]

write_paths = []
write_values = []
if currentValue.value == 1: #Sygnal do wyslania telegramu do bazy danych
	if test == 1: #Czy piszemy do bazy testowej i czy jest polaczenie z baza testowa 
		system.db.runUpdateQuery("INSERT INTO QMES_QOPC_IMPORT (NAME, DATUMZEIT, ZEIT_MS, WERT, STATUS) VALUES ('ST20_PM202_UNLOADINGPRODUCT', SYSDATE, 0, '%s', 0)" %(wert),"DB_TEST") #Wyslanie telegramu do bazy testowej
		write_paths.append("[default]St20/Pm202/WriteDone") #Wyslanie sygnalu WriteDone
		write_value.append(1)
	if prod == 1: #Czy piszemy do bazy produkcyjnej i czy jest polaczenie z baza produkcyjna 
		system.db.runUpdateQuery("INSERT INTO QMES_QOPC_IMPORT (NAME, DATUMZEIT, ZEIT_MS, WERT, STATUS) VALUES ('ST20_PM202_UNLOADINGPRODUCT', SYSDATE, 0, '%s', 0)" %(wert),"DB_PROD") #Wyslanie telegramu do bazy produkcyjnej
		write_paths.append("[default]St20/Pm202/WriteDone") #Wyslanie sygnalu WriteDone
		write_values.append(1)
	
if currentValue.value == 0: #Wyzerowanie WriteRequest przez PLC
	write_paths.append("[default]St20/Pm202/WriteDone") #Wyzerowanie WriteDone
	write_values.append(0)

if write_paths:
	system.tag.writeBlocking(write_paths, write_values)

Additionally, I suggest you check for qualities when reading and writing.

tags = system.tag.readBlocking(paths)
bad_tags = [path for path, tag in zip(paths, tags) if tag.quality.isNotGood()]
if bad_tags:
	logger.warn("bad tag quality for {}".format(bad_tags))
wert, prod, test, testConnection = [tag.value for tag in tags]

write_return = system.tag.writeBlocking(write_paths, write_values)
bad_writes = [path for path, quality in zip(write_paths, write_return) if quality.isNotGood()]
if bad_writes:
	logger.warn("tag write failed for {}".format(bad_writes))
1 Like

Actually, after reading the code more carefully… It can be simplified a lot, assuming a few things:
currentValue, 'test and prod are all booleans. If they’re not, I suggest you change that.

paths = [
	"[default]St20/Pm202/ST20_PM202_UNLOADINGPRODUCT",	#Telegram gotowy do wyslania do MESa
	"[default]St20/Pm202/PisanieDoBazyProdukcyjnej",	#Wysylanie sygnalow do bazy produkcyjnej
	"[default]St20/Pm202/PisanieDoBazyTestowej",		#Wysylanie sygnalow do bazy testowej
	"[default]AvailabilityDBTest",						#Polaczenie z baza testowa
	"[default]AvailabilityDBProd"
]
wert, prod, test, testConnection, prodConnection = [tag.value for tag in system.tag.readBlocking(paths)]

write_paths = ["[default]St20/Pm202/WriteDone"]
if currentValue.value == 1: #Sygnal do wyslania telegramu do bazy danych
	write_values = [1]
	db = "DB_TEST" if test else "DB_PROD"
	system.db.runUpdateQuery("INSERT INTO QMES_QOPC_IMPORT (NAME, DATUMZEIT, ZEIT_MS, WERT, STATUS) VALUES ('ST20_PM202_UNLOADINGPRODUCT', SYSDATE, 0, '%s', 0)" %(wert), db) #Wyslanie telegramu do bazy testowej
else: #Wyzerowanie WriteRequest przez PLC
	write_values = [0]

system.tag.writeBlocking(write_paths, write_values)

Strive to make things as simple as possible, it makes debug and maintenance so much easier.