@JordanCClark
Update #1:
I replicated your suggestion including the creation of new memory tags for the date elements and a new expression tag for resloving the current date.

The Expression for the Date tag:
now()
I then created the following Value Event/Value Changed Script in the Date tag:
def valueChanged(tag, tagPath, previousValue, currentValue, initialChange, missedEvents):
now = currentValue.value
# Make a list of the tags you wish to write to.
timeTags = ['[edge]BMS_Health/Year',
'[edge]BMS_Health/Month',
'[edge]BMS_Health/Day',
'[edge]BMS_Health/Hour',
'[edge]BMS_Health/Minute',
'[edge]BMS_Health/Second',
]
# Make a list of values to write
timeValues = [now.year + 1900,
now.month + 1,
now.date,
now.hours,
now.minutes,
now.seconds
]
# Write the values to the tags
system.tag.writeBlocking(timeTags, timeValues)
With this I was able to make your solution work as expected based on your response. I wasn't that far off in my method although I used individual expresion tags for my date element tags which is inefficient at best.
I have the following follow up questions:
QUESTION #1
When I created the expression tag for current date, I used:
{[System]Gateway/CurrentDateTime.value}
When you created a similar tag, you used:
now()
They both seem to produce the same result. What is the difference? Is one prefered over the other?
QUESTION #2
Having successfully written the Value Change script to write to MEMORY tags, I next needed to get it to write to OPC tags. So I created the following OPC tags:

and I made the followig modification to the Value Change script in my Date Expression tag:
def valueChanged(tag, tagPath, previousValue, currentValue, initialChange, missedEvents):
now = currentValue.value
# Make a list of the tags you wish to write to.
# timeTags = ['[edge]BMS_Health/Year',
# '[edge]BMS_Health/Month',
# '[edge]BMS_Health/Day',
# '[edge]BMS_Health/Hour',
# '[edge]BMS_Health/Minute',
# '[edge]BMS_Health/Second',
timeTags = ['[edge]006_SCADA_YEAR',
'[edge]005_SCADA_MONTH',
'[edge]004_SCADA_DAY',
'[edge]003_SCADA_HOUR',
'[edge]002_SCADA_MINUTE',
'[edge]001_SCADA_SECOND',
'[edge]000_SCADA_HEARTBEAT',
]
# Make a list of values to write
timeValues = [now.year + 1900,
now.month + 1,
now.date,
now.hours,
now.minutes,
now.seconds,
now.seconds % 2
]
# Write the values to the tags
system.tag.writeBlocking(timeTags, timeValues)
This results in the required date elements being successfully written to the OPC tags and I can see that the values get updated in the modbus registers of my modbus gateway.
My question, is this the best way of doing this? Or am I missing a more efficient method? Should I be writing to the memory tags first and then write their values to the OPC tags?
QUESTION #3 (really a statement)
I misunderstod the way the modbus gateway manufacturer intended the heart beat bit to work. Their actual intention is for the SCADA to be setting the heartbeat bit to "1" and then the modbus gateway will reset the value to "0" about a second after it see the bit go high. SCADA is supposed to monitor the value of the register and check to see if the bit goes low. If it doesn't, then SCADA is supposed to assume communication with the gateway is lost. So I'm going to have to investigate how to handle this now.