Changes for page 01 Lua Functions

Last modified by Theodore Xu on 2023/10/26 10:51

From version 11.1
edited by Hunter
on 2023/02/18 15:17
Change comment: There is no comment for this version
To version 5.20
edited by Stone Wu
on 2022/07/12 10:05
Change comment: (Autosaved)

Summary

Details

Page properties
Parent
... ... @@ -1,1 +1,1 @@
1 -V-BOX.V-Net.Manual.04 Lua Script.WebHome
1 +V-BOX.V-Net.1\.User Manual.04 Lua Script.WebHome
Author
... ... @@ -1,1 +1,1 @@
1 -XWiki.Hunter
1 +XWiki.Stone
Content
... ... @@ -140,7 +140,7 @@
140 140  
141 141   Table 2-1
142 142  
143 -(% class="box infomessage" %)
143 +(% class="box errormessage" %)
144 144  (((
145 145  **✎Note: **If HLword enters any other value, it will be treated as invalid.
146 146  )))
... ... @@ -608,12 +608,11 @@
608 608  Attempting to use a script to open a serial port in an unsupported mode will result in an error directly, as below.
609 609  
610 610  |(((
611 -{{code language="LUA"}}
612 612  local setup = {
613 613  
614 614  name = "COM2",
615 615  
616 -mode = 422, -- COM2 does not support RS422
615 +mode = 422, ~-~- COM2 does not support RS422
617 617  
618 618  ...
619 619  
... ... @@ -620,7 +620,6 @@
620 620  }
621 621  
622 622  serial.open(setup)
623 -{{/code}}
624 624  )))
625 625  
626 626  **Data bit:**
... ... @@ -1065,9 +1065,8 @@
1065 1065  
1066 1066  If there is no custom configuration, return an empty table, otherwise, return with "field name/field content"
1067 1067  
1068 -**For example:**
1066 +E.g:
1069 1069  
1070 -{{code language="LUA"}}
1071 1071  {
1072 1072  
1073 1073  [1]= {[1]=1234, [2]=1, [3]='temp', [4]='23.5', [5]={"fruit"="apple"}},
... ... @@ -1080,8 +1080,7 @@
1080 1080  
1081 1081  }
1082 1082  
1083 -Failed: table empty table
1084 -{{/code}}
1080 +Failed: //table// empty table
1085 1085  
1086 1086  (((
1087 1087  == **bns_get_config(string from)** ==
... ... @@ -1161,15 +1161,13 @@
1161 1161  
1162 1162  Type (1: switch, 2: number, 3: string)
1163 1163  
1164 -**For example:**
1160 +E.g:
1161 + {
1165 1165  
1166 -{{code language="LUA"}}
1167 -{
1163 +[1]={~-~-The first communication port
1168 1168  
1169 -[1]={--The first communication port
1165 +[1]={~-~-monitoring point array of the first communication port
1170 1170  
1171 -[1]={--monitoring point array of the first communication port
1172 -
1173 1173  [1]={[1]=11,[2]='data1',[3]=3,[4]=2},
1174 1174  
1175 1175  [2]={[1]=12,[2]='data2',[3]=3,[4]=2},
... ... @@ -1176,23 +1176,23 @@
1176 1176  
1177 1177  ...
1178 1178  
1179 -[n]={[1]=xx,[2]='datan',[3]=x,[4]=x},--n monitoring points
1173 +[n]={[1]=xx,[2]='datan',[3]=x,[4]=x},~-~-n monitoring points
1180 1180  
1181 1181  },
1182 1182  
1183 -[2]=14, --ID
1177 +[2]=14, ~-~-ID
1184 1184  
1185 -[3]='Modbus TCP' --n monitoring points
1179 +[3]='Modbus TCP' ~-~-n monitoring points
1186 1186  
1187 1187  },
1188 1188  
1189 -[2]={--The second communication port
1183 +[2]={~-~-The second communication port
1190 1190  
1191 -[1]={},--The monitoring point of the second communication port is not configured and is empty
1185 +[1]={},~-~-The monitoring point of the second communication port is not configured and is empty
1192 1192  
1193 -[2]=15, --ID
1187 +[2]=15, ~-~-ID
1194 1194  
1195 -[3]='WECON' --communication protocol name
1189 +[3]='WECON' ~-~-communication protocol name
1196 1196  
1197 1197  },
1198 1198  
... ... @@ -1199,7 +1199,6 @@
1199 1199  ...n communication ports and so on
1200 1200  
1201 1201  }
1202 -{{/code}}
1203 1203  
1204 1204  Failed~:// table// empty table
1205 1205  
... ... @@ -1279,9 +1279,8 @@
1279 1279  
1280 1280  Succeed: //table// one-dimensional array
1281 1281  
1282 -**For example:**
1275 +E.g:
1283 1283  
1284 -{{code language="LUA"}}
1285 1285  {
1286 1286  
1287 1287  [1]="This is the oldest message", - the first is the oldest message
... ... @@ -1293,7 +1293,6 @@
1293 1293  [n]="This is the latest message", - the last is the latest message
1294 1294  
1295 1295  }
1296 -{{/code}}
1297 1297  
1298 1298  Failede: nil
1299 1299  
... ... @@ -1311,7 +1311,7 @@
1311 1311  
1312 1312  == **https request** ==
1313 1313  
1314 -**For example:**
1305 +Example
1315 1315  
1316 1316  {{code language="LUA"}}
1317 1317  local json = require("json")
... ... @@ -1367,7 +1367,7 @@
1367 1367  
1368 1368  **Access in bit mode, the prefix is @B_HDX, the number in front of "." indicates the number of the word, and the number behind is the bit number of the word.**
1369 1369  
1370 -**For example:** @B_HDX1020.12, its meaning is to access the system data area in bit mode, the specific location is the 13th bit of the 1020th word.
1361 +For example: @B_HDX1020.12, its meaning is to access the system data area in bit mode, the specific location is the 13th bit of the 1020th word.
1371 1371  
1372 1372  (% class="box infomessage" %)
1373 1373  (((
... ... @@ -1389,7 +1389,7 @@
1389 1389  1. Access in bit mode, the number range is: "@B_HDX0.0"-"@B_HDX299999.15".
1390 1390  
1391 1391  (((
1392 -== **Special data area (HSW/HSX)** ==
1383 +== **8.2 Special data area (HSW/HSX)** ==
1393 1393  
1394 1394  (% class="box infomessage" %)
1395 1395  (((
... ... @@ -1507,19 +1507,8 @@
1507 1507  ** addr_getstring("@W_HSW191",17)
1508 1508  * Obtaining ICCID (read only)
1509 1509  ** addr_getstring("@W_HSW225",15)
1510 -* (((
1511 -TSAP settings of Siemens LOGO PLC*
1512 1512  
1513 1513  (((
1514 -addr_setword("@W_0#HSW1200",8192) means set the Local TSAP as 20.00
1515 -)))
1516 -
1517 -* (((
1518 -addr_setword("@W_0#HSW1201",4096) means set the Remote TSAP as 10.00
1519 -)))
1520 -)))
1521 -
1522 -(((
1523 1523  == **Power-down storage area (HAW/HAX)** ==
1524 1524  
1525 1525  The system storage area (HAW) is used for the system power-down hold registers:
... ... @@ -1554,7 +1554,7 @@
1554 1554  Failed: multi
1555 1555  
1556 1556  (((
1557 -== **send_sms_ucs2(string number, string message)** ==
1537 +== **9.2 send_sms_ucs2(string number, string message)** ==
1558 1558  )))
1559 1559  
1560 1560  **Function:**
... ... @@ -1703,429 +1703,111 @@
1703 1703  * number [prarm.refin]: whether each byte of the data to be measured is inverted by bit, true or false.
1704 1704  * number [prarm.refout]: after the calculation or before the heterodyning output, whether the whole data is inverted by bit, true or false.
1705 1705  
1706 -**Return:**
1686 +Return:
1707 1707  
1708 1708  Success: crc object
1709 1709  
1710 1710  Failure: multi, error code
1711 1711  
1712 -(((
1713 -|=Parameter model name|=poly|=init|=xorout|=refin|=refout
1714 -|crc8|0x07|0x00|0x00|false|false
1715 -|crc8_cdma2000|0x9B|0xFF|0x00|false|false
1716 -|crc8_darc|0x39|0x00|0x00|true|true
1717 -|crc8_dvb_s2|0xD5|0x00|0x00|false|false
1718 -|crc8_ebu|0x1D|0xFF|0x00|true|true
1719 -|crc8_i_code|0x1D|0xFD|0x00|false|false
1720 -|crc8_itu|0x07|0x00|0x55|false|false
1721 -|crc8_maxim|0x31|0x00|0x00|true|true
1722 -|crc8_rohc|0x07|0xFF|0x00|true|true
1723 -|crc8_wcdma|0x9B|0x00|0x00|true|true
1724 -|crc8_sae_j1850|0x1D|0xFF|0xFF|false|false
1725 -|crc8_opensafety|0x2F|0x00|0x00|false|false
1726 -|crc16_tms37157|0x1021|0x3791|0x0000|true|true
1727 -|crc16_a|0x1021|0x6363|0x0000|true|true
1728 -|crc16_riello|0x1021|0x554D|0x0000|true|true
1729 -|crc16_ccitt_false|0x1021|0xFFFF|0x0000|false|false
1730 -|crc16_arc|0x8005|0x0000|0x0000|true|true
1731 -|crc16_arc_ccitt|0x1021|0x1D0F|0x0000|false|false
1732 -|crc16_buypass|0x8005|0x0000|0x0000|false|false
1733 -|crc16_cdma2000|0xC867|0xFFFF|0x0000|false|false
1734 -|crc16_dds110|0x8005|0x800D|0x0000|false|false
1735 -|crc16_dect_r|0x0589|0x0000|0x0001|false|false
1736 -|crc16_dect_x|0x0589|0x0000|0x0000|false|false
1737 -|crc16_dnp|0x3D65|0x0000|0xFFFF|true|true
1738 -|crc16_en_13757|0x3D65|0x0000|0xFFFF|false|false
1739 -|crc16_genibus|0x1021|0xFFFF|0xFFFF|false|false
1740 -|crc16_maxim|0x8005|0x0000|0xFFFF|true|true
1741 -|crc16_mcrf4xx|0x1021|0xFFFF|0x0000|true|true
1742 -|crc16_t10_dif|0x8BB7|0x0000|0x0000|false|false
1743 -|crc16_teledisk|0xA097|0x0000|0x0000|false|false
1744 -|crc16_usb|0x8005|0xFFFF|0xFFFF|true|true
1745 -|crc16_kermit|0x1021|0x0000|0x0000|true|true
1746 1746  
1747 -(% class="wikigeneratedid" %)
1748 -Table 9-1
1749 -
1750 -== **crc:calc(string crcValue)** ==
1751 -
1752 -**Function:** Calculate CRC result
1753 -
1754 -**Parameter:**
1755 -
1756 -crcValue: the value to be calculated
1757 -
1758 -**Return:**
1759 -
1760 -Succeed: calculated result
1761 -
1762 -Failed: multi, error code
1693 +(((
1694 +== **set_network(table config)** ==
1763 1763  )))
1764 1764  
1765 -**For example:**
1697 +**Function:** Set V-BOX network, take effect after restart
1766 1766  
1767 -{{code language="LUA"}}
1768 -function crcTest.main()
1699 +**parameter:**
1769 1769  
1770 -local param = {
1701 +//config~:// incoming network configuration table
1771 1771  
1772 -name = '',
1703 +1. connectMode: the way V-BOX connects to the server, 0: Ethernet, 1: WIFI, 2: 4G, 3: 2G, it is not allowed to be empty.
1704 +1. ethernetEnable: Whether to enable Ethernet, 1: enable, 0: disable, and it is not allowed to be empty.
1705 +1. ethernetLanIp: Set the LAN IP address. Only V-BOX with three network ports support this configuration, and other models of V-BOX do not support setting LAN IP. This item is allowed to be empty.
1706 +1. ethernetIpMode: Whether to enable Ethernet static IP, 1: Enable static IP, 0: DHCP, not allowed to be empty.
1707 +1. ethernetIp: The IP address needs to be configured when the Ethernet static IP is used, and it is not allowed to be empty.
1708 +1. ethernetNetmask: The subnet mask needs to be configured when Ethernet static IP is used, and it is not allowed to be empty.
1709 +1. ethernetGateway: The gateway can be configured when Ethernet static IP is used.
1773 1773  
1774 -width = 64,
1711 +1. When using the Ethernet network, if the Gateway is empty, V-BOX will not connect to the server.
1712 +1. If you only use Ethernet to directly connect to the PLC for communication, you do not need to configure a gateway.
1775 1775  
1776 -poly = 0x42F0E1EBA9EA3693,
1714 +1. ethernetFirstDns: You can configure the preferred DNS server when the Ethernet static IP is used, and it is allowed to be empty. If you use the Ethernet network and do not fill in the DNS server, V-BOX will not be connected to the server.
1715 +1. ethernetSpareDns: Alternate DNS server can be configured when the Ethernet static IP is used, and it is allowed to be empty.
1716 +1. wifiEnable: Whether to enable WIFI, 1: enable, 0: disable, it is not allowed to be empty. If it is a model that does not include WIFI, directly disable it.
1717 +1. wifiName: WIFI name, if WIFI is enabled, it is not allowed to be empty.
1718 +1. wifiPassword: WIFI password, it is allowed to be empty.
1719 +1. wifiIpMode: Whether to enable WIFI static IP, 1: Enable static IP, 0: DHCP, not allowed to be empty.
1720 +1. wifiIp: IP address needs to be configured when WIFI static IP is used, it is not allowed to be empty.
1721 +1. wifiNetmask: The subnet mask needs to be configured when WIFI static IP is used, and it is not allowed to be empty.
1722 +1. wifiGateway: The gateway can be configured when WIFI static IP is used, and it is not allowed to be empty.
1723 +1. wifiFirstDns: You can configure the preferred DNS server when the WIFI static IP is used, and it is allowed to be empty. If you use the WIFI network and do not fill in the DNS server, V-BOX will not be connected to the server.
1724 +1. wifiSpareDns: Alternate DNS server can be configured when the WIFI static IP is used, and it is allowed to be empty.
1725 +1. mobileEnable: Whether to enable the mobile network, 1: enable, 0: disable, it is not allowed to be empty, if it does not include 4G models, directly disable it.
1726 +1. mobileApnMode: Whether to manually configure the APN, 0: Use the default APN, 1: Manually configure the APN, it is not allowed to be empty.
1727 +1. apnName: APN name, if you choose to manually configure APN, it is not allowed to be empty.
1728 +1. apnPassword: APN username, it is allowed to be empty.
1729 +1. apnUserName: APN number, it is allowed to be empty.
1730 +1. apnNumber: APN number, it is allowed to be empty.
1777 1777  
1778 -init = 0xFFFFFFFFFFFFFFFF,
1779 -
1780 -xorout = 0xFFFFFFFFFFFFFFFF,
1781 -
1782 -refin = 1,
1783 -
1784 -refout = 1
1785 -
1786 -}
1787 -
1788 -crc64,err = crc.init(param)
1789 -
1790 -if not crc64 then
1791 -
1792 -print("Crc init failed:", err)
1793 -else
1794 -
1795 -crcvalue = crc64:calc("123456789")
1796 -
1797 -print(string.format("crc64 calc :0X%16X", crcvalue))
1798 -
1799 -end
1800 -
1801 -end
1802 -{{/code}}
1803 -
1804 -= **10 Special function for V-NET** =
1805 -
1806 -== **normal_get_alldata()** ==
1807 -
1808 -**Function: **Obtain the data of all the monitoring points
1809 -
1810 -**Parameter: None**
1811 -
1812 1812  **Return:**
1813 1813  
1814 -Succeed: table two-dimensional arrays, as follows:
1734 +Succeed: true
1815 1815  
1816 -* Each item is a monitoring point and contains 4 attributes:
1817 -** 1: ID
1818 -** 2: status
1819 -** 3: tag name
1820 -** 4: value
1821 -* Status contains 3 enumerated values
1822 -** 0: offline
1823 -** 1: online
1824 -** 2: timeout
1825 -* Customization returns an empty table if there is no configuration, otherwise returns "field name/field content"
1736 +Faied: multi
1826 1826  
1827 -**For example:**
1738 +(((
1739 +== **9.7 remote_com_start(string config)** ==
1740 +)))
1828 1828  
1829 -{{code language="LUA"}}
1830 -{
1742 +**Function:**
1831 1831  
1832 -[1]= {[1]=1234, [2]=1, [3]='temp', [4]='23.5'},
1744 +start serial port pass-through
1833 1833  
1834 -[2]= {[1]=1235, [2]=1, [3]='humi', [4]='67'},
1835 -
1836 -...
1837 -
1838 -[n]= {[1]=xxxx, [2]=x, [3]='xxxx', [4]='xx.x'},
1839 -
1840 -}
1841 -
1842 -Failed: table, empty table
1843 -{{/code}}
1844 -
1845 -== **normal_setdata_byname(string name, string data)** ==
1846 -
1847 -**Function:** Write data to the monitoring point name
1848 -
1849 1849  **Parameter:**
1850 1850  
1851 -name: the name of monitoring point
1748 +//config: //incoming serial port parameter configuration, JSON format
1852 1852  
1853 -data: the data to be written
1750 +1. type:0, serial port pass-through
1751 +1. port: serial port number marked on the V-BOX
1752 +1. comtype:0-RS232, 1-RS485, 2-RS422
1753 +1. baudrate: Baud Rate
1754 +1. data_length: Data Bits
1755 +1. stop_bit: Stop Bit
1756 +1. check_bit: Check Bit
1854 1854  
1855 1855  **Return:**
1856 1856  
1857 -Succeed: string: The value of the monitor point before it is written
1760 +Succeed: true
1858 1858  
1859 -Failed: nil
1762 +Failed: multi
1860 1860  
1861 -== **normal_getdata_byname(string name)** ==
1764 +(((
1765 +== **9.8 remote_com_stop()** ==
1766 +)))
1862 1862  
1863 -**Function:** Read the data of the monitoring point name
1768 +**Function:**
1864 1864  
1865 -**Parameter:**
1770 +close serial port pass-through
1866 1866  
1867 -name: the name of monitoring point
1868 -
1869 1869  **Return:**
1870 1870  
1871 -Succeed: string
1774 +Succeed: true
1872 1872  
1873 -Failed: nil
1874 -
1875 -= **11 MySQL database operation** =
1876 -
1877 -== **luaMySql.init(string sourcename, string username, string password, string host, number port, string character)** ==
1878 -
1879 -**Function:** Configure database connection parameters
1880 -
1881 -**Parameter:**
1882 -
1883 -sourcename: the name of database
1884 -
1885 -username: the username of the connection
1886 -
1887 -password: the password of the connection
1888 -
1889 -host: the host name of the connection
1890 -
1891 -port: the host port of the connection
1892 -
1893 -character: the character set of the connection
1894 -
1895 -**Return:**
1896 -
1897 -Succeed: string
1898 -
1899 1899  Failed: multi
1900 1900  
1901 -== **luaMySql.exec(string statement)** ==
1778 +(((
1779 +== **9.9 remote_com_state()** ==
1780 +)))
1902 1902  
1903 -**Function:** Execute the given SQL statement without returning the result set (add, delete, change)
1782 +**Function:**
1904 1904  
1905 -**Parameter:**
1784 +query the serial port pass-through status and pass-through server domain name and port
1906 1906  
1907 -statement: the given SQL statement
1908 -
1909 1909  **Return:**
1910 1910  
1911 -Succeed: status: returns the number of rows affected by SQL statement execution.
1788 +Succeed:
1912 1912  
1913 -Failed: nil, errorString
1790 +1. number, current pass-through status: 0-none 1,2-starting pass-through 3-penetrating 4,5-finishing pass-through 6-pass-through error
1791 +1. string, pass-through server domain name and port number, xxxx (domain name): xxx (port number)
1914 1914  
1915 -== **luaMySql.execWithResult(string statement)** ==
1916 -
1917 -**Function:** Execute the given SQL statement returning the result set (check)
1918 -
1919 -**Parameter:**
1920 -
1921 -statement: the given SQL statement
1922 -
1923 -**Return:**
1924 -
1925 -Succeed: table: returns the result set
1926 -
1927 -Failed: nil, errorString
1928 -
1929 -**For example:**
1930 -
1931 -{{code language="LUA"}}
1932 -mysql = require"mysqlclient"
1933 -
1934 -function DataInitRight()
1935 -
1936 -local dbName = "db_lua1"
1937 -
1938 -local user = "root"
1939 -
1940 -local pwd = "123456"
1941 -
1942 -local host = "192.168.56.186"
1943 -
1944 -local port = 3306
1945 -local character = "UTF8"
1946 -
1947 -mysql.init(dbName, user, pwd, host, port, character)
1948 -
1949 -end
1950 -
1951 -function ExecFunc()
1952 -
1953 -status, errorString = mysql.exec("delete from tb_lua1 where mykey =
1954 -
1955 -10;")
1956 -
1957 -if nil == status then
1958 -
1959 -print("ExecFunc() error:", errorString)
1960 -
1961 -return -1
1962 -
1963 -else
1964 -
1965 -print("the number of rows affected by the command:", status)
1966 -
1967 -end
1968 -
1969 -return 0
1970 -
1971 -end
1972 -
1973 -function ExecWithResultFunc()
1974 -
1975 -status, errorString = mysql.execWithResult("select * from tb_lua1;")
1976 -
1977 -if nil == status then
1978 -
1979 -print("ExecWithResultFunc() error:", errorString)
1980 -
1981 -return -1
1982 -
1983 -else
1984 -
1985 -print("ExecWithResultFunc()
1986 -
1987 -success
1988 -
1989 -: status
1990 -
1991 -type
1992 -
1993 -=
1994 -
1995 -",
1996 -
1997 -type(status))
1998 -
1999 -print("ExecWithResultFunc() success : status len = ", #status)
2000 -
2001 -local num = #status
2002 -
2003 -local i = 1
2004 -
2005 -if num > 0 then
2006 -
2007 -for i = 1, num, 1 do
2008 -
2009 -local var = string.format("select result[%d] :mykey = %d,
2010 -
2011 -value = %s", i, status[i].mykey, status[i].value)
2012 -
2013 -print(var)
2014 -
2015 -end
2016 -
2017 -end
2018 -
2019 -print("---------------")
2020 -
2021 -end
2022 -
2023 -return 0
2024 -end
2025 -
2026 -function luaMysql_apiTest.main()
2027 -
2028 -print("script running ...")
2029 -
2030 -DataInitRight()
2031 -
2032 ---use exec demo
2033 -
2034 -if ExecFunc() < 0 then
2035 -
2036 -return
2037 -
2038 -end
2039 -
2040 ---use execWithResult demo
2041 -
2042 -if ExecWithResultFunc() < 0 then
2043 -
2044 -return
2045 -
2046 -end
2047 -
2048 -print("script running success")
2049 -
2050 -end
2051 -{{/code}}
2052 -
2053 -= **12 Message summary algorithm** =
2054 -
2055 -== **hmac(string hash_func, string key, string message)** ==
2056 -
2057 -**Function:** HMAC calculate
2058 -
2059 -**Function name**
2060 -
2061 -hash_func:
2062 -
2063 -* [md5, sha1, sha224, sha256, sha384, sha512]
2064 -* [sha512_224, sha512_256, sha3_224, sha3_256]
2065 -* [sha3_384, sha3_512]
2066 -
2067 -**Parameter:**
2068 -
2069 -key: the key
2070 -
2071 -message: message content
2072 -
2073 -**Return:**
2074 -
2075 -Succeed: string, calculation result
2076 -
2077 -Failed: nil
2078 -
2079 -**For example:**
2080 -
2081 -{{code language="LUA"}}
2082 -local sha = require"sha2"
2083 -
2084 -function hmac_test.main()
2085 -
2086 -local hmac = sha.hmac
2087 -
2088 -print(hmac(sha.sha1,
2089 -
2090 -"your key", "your message"))
2091 -
2092 -end
2093 -{{/code}}
2094 -
2095 -== **sha(string message** ==
2096 -
2097 -**Function:** SHA calculate
2098 -
2099 -**Function name:**
2100 -
2101 -sha:
2102 -
2103 -* sha1, sha224, sha256, sha384, sha512]
2104 -* [sha512_224, sha512_256, sha3_224, sha3_256]
2105 -* [sha3_384, sha3_512]
2106 -
2107 -**Parameter:**
2108 -
2109 -key: the key
2110 -
2111 -message: message content
2112 -
2113 -**Return:**
2114 -
2115 -Succeed: string, calculation result
2116 -
2117 -Failed: nil
2118 -
2119 -For example:
2120 -
2121 -{{code language="LUA"}}
2122 -local sha = require"sha2"
2123 -
2124 -function sha_test.main()
2125 -
2126 -local sha256 = sha.sha256
2127 -
2128 -print(sha256("your message"))
2129 -
2130 -end
2131 -{{/code}}
1793 +Failed: multi